Passing parameters to bash when executing a script fetched by curl

BashCurlParameter Passing

Bash Problem Overview


I know how to execute remote Bash scripts like this:

curl http://example.com/script.sh | bash

or

bash < <( curl http://example.com/script.sh )

which give the same result.

But what if I need to pass arguments to the bash script? It's possible when the script is saved locally:

./script.sh argument1 argument2

I tried several possibilities like this one, without success:

bash < <( curl http://example.com/script.sh ) argument1 argument2

Bash Solutions


Solution 1 - Bash

To improve on jinowolski's answer a bit, you should use:

curl http://example.com/script.sh | bash -s -- arg1 arg2

Notice the two dashes (--) which are telling bash to not process anything following it as arguments to bash.

This way it will work with any kind of arguments, e.g.:

curl -L http://bootstrap.saltstack.org | bash -s -- -M -N stable

This will of course work with any kind of input via stdin, not just curl, so you can confirm that it works with simple BASH script input via echo:

echo 'i=1; for a in $@; do echo "$i = $a"; i=$((i+1)); done' | \
bash -s -- -a1 -a2 -a3 --long some_text

Will give you the output

1 = -a1
2 = -a2
3 = -a3
4 = --long
5 = some_text

Solution 2 - Bash

try

curl http://foo.com/script.sh | bash -s arg1 arg2

bash manual says:

> If the -s option is present, or if no arguments remain after option processing, then commands are read from the standard input. This option allows the positional parameters to be set when invoking an interactive shell.

Solution 3 - Bash

Other alternatives:

curl http://foo.com/script.sh | bash /dev/stdin arguments
bash <( curl http://foo.com/script.sh ) arguments

Solution 4 - Bash

Building on others' answers, if you want your bash script to use pipes, try:

cat myfile.txt | \
bash -c "$(curl http://example.com/script.sh )" -s arg1 arg2

Example usage:

#!/usr/bin/env bash

export MYURL="https://raw.githubusercontent.com/sohale/snippets/master/bash-magic/add-date.sh"
curl http://www.google.com | \
bash -c "$(curl -L $MYURL )" -s "       >>>>> next line πŸ•ΆπŸ‘‰"

If you use bit.ly to shorten the url, don't forget the -L.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDaniel RView Question on Stackoverflow
Solution 1 - BashJanne EnbergView Answer on Stackoverflow
Solution 2 - BashjinowolskiView Answer on Stackoverflow
Solution 3 - BashephemientView Answer on Stackoverflow
Solution 4 - BashSohail SiView Answer on Stackoverflow