karl@haddock.UUCP (12/13/86)
Newsgroups: comp.bugs.4bsd,comp.unix.questions Subject: $* and $@ (Was: nohup (from Bourne shell)) References: <181@haddock.UUCP> <106@quacky.UUCP> Reply-To: karl@haddock.ISC.COM.UUCP (Karl Heuer) Followup-To: comp.unix.questions Distribution: world Organization: Interactive Systems, Boston In article <106@quacky.UUCP> dce@quacky.UUCP (David Elliott) writes: >In article <181@haddock.UUCP> karl@haddock.isc.com.UUCP (Karl Heuer) writes: >>The shell script /usr/bin/nohup uses `$*' where it should use `$@'; this >>breaks things like `nohup sh -c "echo foo"' because the quotes get lost. > >Yes and no. Nohup should say exec nice -5 "$@" That's what I meant, of course. Thanks for the clarification. >There is one slight problem with "$@" [namely, when $# = 0 it gives you a >null string instead of nothing at all]. I've discussed this bug with >Steve Bourne, and he agrees that it is incorrect behavior. Good! I've been trying for years to convince people that it's a bug. >Add [code elided] to the beginning of the subroutine macro() in macro.c, and >the bug goes away. It is somewhat kludgy, but it works. The whole concept of "$@" is somewhat kludgy. (Why doesn't "a$@b" return "a$1b" "a$2b" ... ?) But it's indispensible. >Also, while I'm here, I'll show a way to properly build a list into a single >variable. Typically, this is done as > for i { List="$List $i"; } > command $List >This is incorrect, since it breaks if an argument contains spaces or tabs >or newlines or what have you. The following works much better: > for arg { Arg_list="$Arg_list '$arg'"; } > eval command "$Arg_list" Better, but now it breaks if an argument contains a single quote. Is there a method that preserves all the printing characters, and works on all versions of sh? (I tried to do something with sed 's/[\\"`$]/\\&/' and stuffing the result into double quotes, but I couldn't find a portable mechanism.) Karl W. Z. Heuer (ima!haddock!karl or karl@haddock.isc.com), The Walking Lint (Followups to comp.unix.questions, unless you have more bugs to report.)