* Bash to Zsh Funny
@ 2005-03-09 11:26 zzapper
2005-03-09 11:41 ` J
0 siblings, 1 reply; 6+ messages in thread
From: zzapper @ 2005-03-09 11:26 UTC (permalink / raw)
To: zsh-users
Hi,
The following runs as bash but not zsh, because the line which evaulates to:-
gvim.exe note123.txt note345.txt &
In bash fine gvim edits the two files
in zsh
gvim tries to edit the filename "note123.txt note345.txt" as tho it were one long filename
#!/bin/zsh
# gg
# description : vi all files containing $1 in name
set +x
cd c:/intranet/note/
if [ $# -gt 0 ]
then
files=$(grep -il "note [0-9][0-9][0-9].*$1" $(find . -name 'note???.txt'))
if [ "$files" != "" ]
then
files=${files//[[:space:]]/ }
echo $files
gvim.exe $files &
else
echo sorry $1 not found
fi
fi
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Bash to Zsh Funny
2005-03-09 11:26 Bash to Zsh Funny zzapper
@ 2005-03-09 11:41 ` J
2005-03-09 12:01 ` David Rayner
2005-03-09 16:14 ` Dan Nelson
0 siblings, 2 replies; 6+ messages in thread
From: J @ 2005-03-09 11:41 UTC (permalink / raw)
To: zzapper; +Cc: zsh-users
> gvim.exe $files &
When you execute this line, $files is one space-separated string.
zsh expands this to only one string and doesn't perform
word-splitting, and that's what you expect most of the time. bash on
the other hand performs word-splitting.
Compare results of:
$ a='b c'
$ for i in $a; do echo $i; done
...in both zsh and bash.
If you want to activate word-splitting in zsh, you can ask for it
specifically for this expansion with ${=var}, or you can setopt
shwordsplit to activate it for all expansions.
You can get more info in the FAQ,
http://zsh.sunsite.dk/FAQ/zshfaq03.html#l17
--
J
"- Watashi, DATE-tte hajimete datta no...
- Sou kai ?
- Hontou wa suki na hito to surun deshou ?" -- Tokugawa Asuka
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Bash to Zsh Funny
2005-03-09 11:41 ` J
@ 2005-03-09 12:01 ` David Rayner
2005-03-10 13:24 ` zzapper
2005-03-09 16:14 ` Dan Nelson
1 sibling, 1 reply; 6+ messages in thread
From: David Rayner @ 2005-03-09 12:01 UTC (permalink / raw)
To: J; +Cc: zsh-users
Merci
> > gvim.exe $files &
setopt shwordsplit
--
Best Regards
David Rayner MSc CEng
Frustra laborant quotquot se calculationibus fatigant pro inventione quadraturae
circuli.
http://www.rayninfo.co.uk/blogger.html
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Bash to Zsh Funny
2005-03-09 11:41 ` J
2005-03-09 12:01 ` David Rayner
@ 2005-03-09 16:14 ` Dan Nelson
1 sibling, 0 replies; 6+ messages in thread
From: Dan Nelson @ 2005-03-09 16:14 UTC (permalink / raw)
To: J; +Cc: zzapper, zsh-users
In the last episode (Mar 09), J said:
> > gvim.exe $files &
>
> When you execute this line, $files is one space-separated string.
> zsh expands this to only one string and doesn't perform
> word-splitting, and that's what you expect most of the time. bash on
> the other hand performs word-splitting.
>
> Compare results of:
> $ a='b c'
> $ for i in $a; do echo $i; done
> ...in both zsh and bash.
>
> If you want to activate word-splitting in zsh, you can ask for it
> specifically for this expansion with ${=var}, or you can setopt
> shwordsplit to activate it for all expansions.
I think using arrays to store filenames is more natural:
files=( *.txt )
which will preserve spaces within the filenames. Note that you can
also do things like
files=$( grep --null -l mytext * )
files=( ${(ps:\0:)files} )
, to get a string of null-delimited filenames, then split on the null
to get your array. Note that $(find . -name 'note???.txt') is
redundant; just use zsh's globbing directly. If you know the resulting
filenames won't contain spaces:
files=($(grep -il "note [0-9][0-9][0-9].*$1" note???.txt))
--
Dan Nelson
dnelson@allantgroup.com
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Bash to Zsh Funny
2005-03-09 12:01 ` David Rayner
@ 2005-03-10 13:24 ` zzapper
[not found] ` <david@tvis.co.uk>
0 siblings, 1 reply; 6+ messages in thread
From: zzapper @ 2005-03-10 13:24 UTC (permalink / raw)
To: zsh-users
Hi
What I ended up with
#!/bin/zsh
# gg
# description : vi all notes containing keyword ($1) in subject
cd c:/note/
if [ $# -gt 0 ]
then
files=($(egrep -il "note [0-9]{3}.*$1" note???.txt))
if [ "$files" != "" ]
then
echo $files
gvim.exe $files &
else
echo sorry $1 not found
fi
else
echo "Keyword required eg:- > gg php"
fi
Any improvments?
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Bash to Zsh Funny
[not found] ` <david@tvis.co.uk>
@ 2005-03-10 13:46 ` Peter Stephenson
0 siblings, 0 replies; 6+ messages in thread
From: Peter Stephenson @ 2005-03-10 13:46 UTC (permalink / raw)
To: zsh-users
zzapper wrote:
> Any improvments?
> if [ "$files" != "" ]
It would probably be more standard to rewrite this as
if [[ ${#files} -gt 0 ]]
or equivalently
if (( ${#files} ))
which test whether there are any elements in the array. However, in
practice what you have will work fine, since a zero-length filename
is meaningless.
pws
**********************************************************************
This email and any files transmitted with it are confidential and
intended solely for the use of the individual or entity to whom they
are addressed. If you have received this email in error please notify
the system manager.
**********************************************************************
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2005-03-10 13:47 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-03-09 11:26 Bash to Zsh Funny zzapper
2005-03-09 11:41 ` J
2005-03-09 12:01 ` David Rayner
2005-03-10 13:24 ` zzapper
[not found] ` <david@tvis.co.uk>
2005-03-10 13:46 ` Peter Stephenson
2005-03-09 16:14 ` Dan Nelson
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).