tags:

views:

419

answers:

3

Man page for bash says, regarding -c option:

-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.

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.

What I am really trying to do here is to execute a bit of 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 args to the stuff that follows eval. I'm open to other suggestions as well.

+3  A: 

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.

martin clayton
Martin - Can you please edit your response to note the option of escaping the $ characters as NawaMan pointed out in his response, and I'll then accept your response. Thanks. Chris
Chris Markle
+1  A: 

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.

NawaMan
+1  A: 

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.

tyranid