Re: [g.l.d.user] Re: A quick Q: how do I command something in large amount
On Mon, 19 Sep 2011 11:15:08 +0700, Ivan wrote in message
<[🔎] 86fwjtp3qr.fsf@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 <arnt@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)
Reply to: