The man page for Bash says, regarding the -c
option:
-c string
If the-c
option is present, then comma
You need to use single quotes to prevent interpolation happening in your calling shell.
$ bash -c 'echo arg 0: $0, arg 1: $1' arg1 arg2
arg 0: arg1, arg 1: arg2
Or escape the variables in your double-quoted string. Which to use might depend on exactly what you want to put in your snippet of code.
Because '$0
' and '$1
' in your string is replaced with a variable #0 and #1 respectively.
Try :
bash -c "echo arg 0: \$0, arg 1: \$1" arg0 arg1
In this code $
of both are escape so base see it as a string $
and not get replaced.
The result of this command is:
arg 0: arg0, arg 1: arg1
Hope this helps.
Add a backslash to the $0
(i.e., \$0
), otherwise your current shell escapes $0
to the name of the shell before it even gets to the subshell.
martin is right about the interpolation: you need to use single quotes. But note that if you're trying to pass arguments to a command that is being executed within the string, you need to forward them on explicitly. For example, if you have a script foo.sh like:
#!/bin/bash
echo 0:$0
echo 1:$1
echo 2:$2
Then you should call it like this:
$ bash -c './foo.sh ${1+"$@"}' foo "bar baz"
0:./foo.sh
1:bar baz
2:
Or more generally bash -c '${0} ${1+"$@"}' <command> [argument]...
Not like this:
$ bash -c ./foo.sh foo "bar baz"
0:./foo.sh
1:
2:
Nor like this:
$ bash -c './foo.sh $@' foo "bar baz"
0:./foo.sh
1:bar
2:baz
This means you can pass in arguments to sub-processes without embedding them in the command string, and without worrying about escaping them.