James Ko
James Ko

Reputation: 34579

Passing arguments to a script invoked with bash -c

I'm testing a Bash script I created on GitHub for behavioral correctness (e.g. that it parses options correctly). I want to do this without having to clone the repository locally, so here is how I'm doing it:

curl -sSL https://github.com/jamesqo/gid/raw/master/gid | xargs -0 bash -c

My question is, how can I pass arguments to the script in question? I tried bash -c --help, but that didn't work since it got interpreted as part of the script.

Thanks!

Upvotes: 1

Views: 783

Answers (2)

Anya Shenanigans
Anya Shenanigans

Reputation: 94769

I'll echo Anthony's comments - it makes a lot more sense to download the script and execute it directly, but if you're really set on using the -c option for bash, it's a little bit complicated, the problem is that when you do:

something | xargs -0 bash -c

there's no opportunity to pass any arguments. They all get swallowed as the argument to -c - it essentially gets turned into:

bash -c "$(something)"

so if you place something after the -c in the xargs, it gets before the something. There is no opportunity to put anything after something, as xargs doesn't let you.

If you want to pass arguments, you have to use the substitution position option for xargs, which allows you to place where the argument goes, The option is -J <item>, and the next thing to realize is that the first argument will be $0, so you have to do:

something | xargs -0 -I @ bash -c @ something <arg1> <arg2>…

I can emulate this with:

echo 'echo hi: ~$0~ ~$1~ ~$2~ ~$3~' | xargs -0 -I @ bash -c @ something one two three four

which yields:

hi: ~something~ ~one~ ~two~ ~three~

Upvotes: 2

Anthony Geoghegan
Anthony Geoghegan

Reputation: 12003

You’re actually over-complicating things by using xargs with Bash’s -c option.

Download the script directly

You don’t need to clone the repository to run the script. Just download it directly:

curl -o gid https://raw.githubusercontent.com/jamesqo/gid/master/gid

Now that it’s downloaded as gid, you can run it as a Bash script, e.g.,

bash gid --help

You can also make the downloaded script executable in order to run it as a regular Unix script file (using its shebang, #!/bin/bash):

chmod +x gid
./gid --help

Use process substitution

If you wanted to run the script without actually saving it to a file, you could use Bash process substitution:

bash <(curl -sSL https://github.com/jamesqo/gid/raw/master/gid) --help

Upvotes: 2

Related Questions