Aaron Griffin wrote:
On Tue, Oct 20, 2009 at 10:17 PM, Dan McGee <[email protected]> wrote:
On Tue, Oct 20, 2009 at 9:45 PM, Allan McRae <[email protected]> wrote:
Hi all,

This problem has been doing my head in...    First a minimal example that
reflects how makepkg does things:

--one.sh--
#!/bin/bash

echo "pass 1:"
for arg in "$@"; do
 echo $arg
done
echo

ARGLIST="$@"

./two.sh $ARGLIST
--end one.sh--

--two.sh--
#!/bin/bash

echo "pass 2:"
for arg in "$@"; do
 echo $arg
done
--end two.sh--

then run:
./one.sh -f -h "foo bar"
pass 1:
-f
-h
foo bar

pass 2:
-f
-h
foo
bar


Note how in pass two, foo and bar are no longer in the one line.   Of
course, passing ./two.sh "$@" works, but the argument parsing in makepkg
clears that, hence the need to save it to ARGLIST.

Any ideas?
Of course! I think I got it.

dmc...@kilkenny /tmp
$ ./one.sh -f -h "foo bar"
pass 1:
-f
-h
foo bar

pass 2:
-f
-h
foo
bar

dmc...@kilkenny /tmp
$ ./one-new.sh -f -h "foo bar"
pass 1:
-f
-h
foo bar

pass 2:
-f
-h
foo bar

$ cat one-new.sh
#!/bin/bash
echo "pass 1:"
for arg in "$@"; do
 echo $arg
done
echo

ARGLIST=("$@")

./two.sh "${argli...@]}"

Do I win a prize or anything? :P

It's worth noting that the following works two:

./two.sh "$@"

The reason being that "$@" is special in bash. It actually expands to
the command line quoted as you passed it, with "foo bar" being one
argument. The issue is with the assignment to a single bash variable

The reason that can not be used in makepkg is the option parsing uses "shift" and thus clears the value of $@ as it goes.

Allan



Reply via email to