On Mon, 19 Sep 2011 11:15:08 +0700, Ivan wrote in message 
<86fwjtp3qr....@gray.siamics.net>:

> The following message is a courtesy copy of an article
> that has been posted to comp.unix.shell as well.
> 
> >>>>> Arnt Karlsen <a...@c2i.net> writes:
> >>>>> On Fri, 16 Sep 2011 00:17:47 +0700, Ivan wrote:
> 
>       [Cross-posting to comp.unix.shell for no good reason at all.]
> 
>  >> Whitespace is not a problem as long as one remembers to
>  >> double-quote Shell $ubstitutions, like:
> 
>  >> for i in a b c ; do
> 
>  > ..or, e.g.: for i in $(ls /path/to/files/*.txt ) ; do
> 
>       No, it isn't whitespace-tolerant, as the result of the
> unescaped $()-substitution is subject to IFS-splitting.  The correct
> form would be:
> 
>     for i in /path/to/files/*.txt ; do something ; done 
> 
>       Consider, e. g.:
> 
> $ ls -1 
> a
> b c
> $ (for x in $(ls *) ; do echo ."$x". ; done) 
> .a.
> .b.
> .c.
> $ 
> 
>       Moreover, ls(1) is an extra here; the command above requests
> the Shell to search for all the .txt filenames in /path/to/files/,
>       then the filenames are passed to ls(1), which is supposed to
>       pass them back to the shell unaltered.  There, ls(1) may
>       essentially behave the same as, say, $ echo, or $ printf
> %s\\n.
> 
>       This is somewhat akin to UUoC, as in:
> 
> $ cat < "$file" | grep something 
> 
>       vs. simply:
> 
> $ grep something < "$file" 
> 
>       Or it may not.  Consider that one of the .txt-filenames refers
>       to a directory, like:
> 
> $ ls -1RF 
> .:
> a
> b c
> d/
> 
> ./d:
> x y
> $ (for x in $(ls *) ; do echo ."$x". ; done) 
> .a.
> .b.
> .c.
> .d:.
> .x.
> .y.
> $ 
> 
>       Note that the above has ‘x’ set to ‘d:’, ‘x’ and ‘y’, neither
> of whose belong to the current directory.
> 
>       (NB: the term “path” is also considered obsolete by GNU when
>       speaking of “whole names”, as opposed to “search paths”, such
>       as, e. g., "$PATH" or "$CDPATH".  In particular, GNU find(1)
>       states that -wholename is preferred to -path.)
> 
>  >>   txt2pdf -input "${i}.txt" -out "${i}.pdf"
>  >> done
> 
>  > ..disclaimer: I've only used the alleged obsolete back-tick
>  > way. ;o)
> 
>       The backticks are harder to both nest and mix with other Shell
>       substitutions and escapes.  Consider, e. g.:
> 
> $ echo \\\" 
> \"
> $ 
> 
>       To put the stdout of the command above into a Shell variable,
> we may use either the $()-substitution:
> 
> $ x=$(echo \\\") ; echo "$y" 
> \"
> $ 
> 
>       or the backticks:
> 
> $ y=`echo \\\\\\"` ; echo "$y" 
> \"
> $ 
> 
>       Now, can you explain why the backslashes above have to be
>       doubled in the latter case?
> 

..unless that escapes my mind, I'd rather call them escaped. ;o)


-- 
To UNSUBSCRIBE, email to debian-user-requ...@lists.debian.org 
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: http://lists.debian.org/20110921170503.16747...@nb6.lan

Reply via email to