1

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

    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.

      1

      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" 
      6
      • 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
        CommentedJul 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
        CommentedJul 30, 2015 at 16:05
      • I get an error with this one :). In any case, why would escaping the dollar help?
        – terdon
        CommentedJul 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
        CommentedJul 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
        CommentedJul 30, 2015 at 16:14

      You must log in to answer this question.

      Start asking to get answers

      Find the answer to your question by asking.

      Ask question

      Explore related questions

      See similar questions with these tags.