Let's say I've got this script :

x-terminal-emulator -e bash -c 'echo hello > ~/text'

I call it foo.sh and make it executable.

If I execute this script I'll have a text file in my home folder containing the word 'hello'.

Now if I modify it to this :

x-terminal-emulator -e bash -c 'echo $1 > ~/text'

... and I execute it in a terminal like this :

./foo.sh hello

I get a text file in my home folder containing nothing.

foo.sh receives 'hello' as the first and only argument ($1). So why doesn't bash receive it ? Is there a way to pass one or several arguments from foo.sh to bash ?

I tried to store the argument inside a variable name and then export it but it didn't change the result.

2 Answers 2


From man bash

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

So you can do

x-terminal-emulator -e bash -c 'echo $0 > ~/text' "$1"

or (if you prefer to preserve the "usual" numbering of parameters)

x-terminal-emulator -e bash -c 'echo $1 > ~/text' _ "$1"

where _ can be replaced with any dummy variable of your choice.


In bash -c 'echo $1 > ~/text', $1 was expanded in bash -c process, not in your script. You need to pass the original $1 to bash -c:

x-terminal-emulator -e "bash -c 'echo \$1 > ~/text' bash $1"
  • Why complicate things? Why not just use double quotes: x-terminal-emulator -e bash -c "echo $1 > ~/text". Also, I can't get yours to work, it gives an error, but I don't understand why escaping the dollar would help. That just tells bash -c to echo its $1 as far as I can tell.
    – terdon
    Commented Jul 30, 2015 at 16:00
  • @terdon: I got error unknown option -c with xfce4-terminal -e bash -c 'echo \$@;sleep 10' _ 123, so wrapping command in the whole string can be more portable. And some time you only need using several of parameters, so "bash -c 'echo \$@ > ~/text' bash $1 $2 $3" is easier.
    – cuonglm
    Commented Jul 30, 2015 at 16:05
  • I get an error with this one :). In any case, why would escaping the dollar help?
    – terdon
    Commented Jul 30, 2015 at 16:08
  • @terdon: it prevents $1 from being expanded by parent shell. Example in "bash -c 'echo $1 $2 $3 > ~/text' bash $2 $1 $3", then $1 inside bash -c isn't $1 that you passed to it.
    – cuonglm
    Commented Jul 30, 2015 at 16:12
  • No, of course not, but the OP wants the $1 from the shell script, they're not actually passing anything to the bash -c process. They want to get $1 as given on the command line. I just don't see the point of passing $1 again since it's already defined.
    – terdon
    Commented Jul 30, 2015 at 16:14

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .