Fixing bash script bogosity - help?

Bert Freudenberg bert at freudenbergs.de
Tue Apr 28 09:28:15 EDT 2009


On 28.04.2009, at 15:09, pgf at laptop.org wrote:

> bert wrote:
>>
>> On 28.04.2009, at 14:27, pgf at laptop.org wrote:
>>
>>> bert wrote:
>>>>
>>>> On 28.04.2009, at 13:37, Martin Langhoff wrote:
>>>>
>>>>> On Tue, Apr 28, 2009 at 1:19 PM, Ignacio Vazquez-Abrams
>>>>> <ivazqueznet at gmail.com> wrote:
>>>>>> Ah, I see now.
>>>>>>
>>>>>> Try this:
>>>>>>
>>>>>> bash -c 'touch "$@"' "${CMD[@]}"
>>>>>
>>>>> Riiight, that works better... but
>>>>>
>>>>>> Or in the case of the full script:
>>>>>>
>>>>>> bash -c "$ERL"' "$@"' "${ERL_COMMAND[@]}"
>>>>>
>>>>> ...it doesn't work for runuser -- which is the real target.  
>>>>> Runuser
>>>>> looks at the added params after -c and tries to parse them. There
>>>>> doesn't seem to be any support for passing parameters.
>>>>>
>>>>> hmmmmm.
>>>>
>>>> Maybe you should use su directly instead of runuser?
>>>
>>> won't that have the same problem?  it still wants a command
>>> passed via a -c STRING convention.
>>>
>>> i think this is somewhat intractable, and any time spent on it
>>> would be better spent creating a patch to runuser that lets it
>>> take its command as strace does, or as xterm does with -e, which
>>> avoids the vector->string->vector translations which are the real
>>> issue.
>>
>>
>> No, su passes all arguments after -c to the program you specify.
>
> can you give an example?
>
>    $ su root -c /bin/echo one two three
>    Password:
>
>    $ su root -c '/bin/echo one two three'
>    Password:
>    one two three
>    $


It's not a problem in su but in bash. See "man bash":

  -c string If  the  -c  option  is  present, then commands are read  
from
            string.  If there are arguments after the  string,  they   
are
            assigned to the positional parameters, starting with $0.

Note it starts with $0 not $1. So this works:

$ su root -c '/bin/echo "$@"' /bin/echo one two three

- Bert -





More information about the Devel mailing list