The man page for Bash says, regarding the -c
option:
-c string
If the-c
option is present, then commands are read fromstring
. If there are arguments after the string, they are assigned to the positional parameters, starting with$0
.
So given that description, I would think something like this ought to work:
bash -c "echo arg 0: $0, arg 1: $1" arg1
but the output just shows the following, so it looks like the arguments after the -c
string are not being assigned to the positional parameters.
arg 0: -bash, arg 1:
I am running a fairly ancient Bash (on Fedora 4):
[root@dd42 trunk]# bash --version GNU bash, version 3.00.16(1)-release (i386-redhat-linux-gnu) Copyright (C) 2004 Free Software Foundation, Inc.
I am really trying to execute a bit of a shell script with arguments. I thought -c
looked very promising, hence the issue above. I wondered about using eval, but I don't think I can pass arguments to the stuff that follows eval. I'm open to other suggestions as well.
Because '
$0
' and '$1
' in your string is replaced with a variable #0 and #1 respectively.Try :
In this code
$
of both are escape so base see it as a string$
and not get replaced.The result of this command is:
Hope this helps.
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:
Then you should call it like this:
Or more generally
bash -c '${0} ${1+"$@"}' <command> [argument]...
Not like this:
Nor like this:
This means you can pass in arguments to sub-processes without embedding them in the command string, and without worrying about escaping them.
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.You need to use single quotes to prevent interpolation happening in your calling shell.
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.