Passing arguments to /bin/bash via a bash script

bash

Solution

Quoting the bash manual for `-c`:

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.

Works for me:

$ cat x.sh
#!/bin/bash
/bin/bash --login -c 'echo 1:$1 2:$2 3:$3' echo "$@"
$ ./x.sh "foo bar" "baz" "argh blargh quargh"
1:foo bar 2:baz 3:argh blargh quargh

I don't know how you arrived at the "passes no arguments" conclusion, maybe you missed the `$0` bit?

Problem

I am writing a bash script that takes a number of command line arguments (possibly including spaces) and passes all of them to a program (/bin/some_program) via a login shell. The login shell that is called from the bash script will depend on the user's login shell. Let's suppose the user uses /bin/bash as their login shell in this example... but it might be /bin/tcsh or anything else. If I know how many arguments will be passed to some_program, I can put the following lines in my bash script: ``` #!/bin/bash # ... (some lines where we determine that the user's login shell is bash) ... /bin/bash --login -c "/bin/some_program \"$1\" \"$2\"" ``` and then call the above script as follows: ``` my_script "this is too" cool ``` With the above example I can confirm that some_program receives two arguments, "this is too" and "cool". My question is... what if I don't know how many arguments will be passed? I'd like to pass all the arguments that were sent to my_script along to some_program. The problem is I can't figure out how to do this. Here are some things that don't work: ``` /bin/bash --login -c "/bin/some_program $@" # --> 3 arguments: "this","is","too" /bin/bash --login -c /bin/some_program "$@" # --> passes no arguments ```

Original source