Como passar argumento para script que é entrada para bash

10

Agora eu tenho uma linha como esta:

curl -fsSL http://git.io/vvZMn | bash

Ele está baixando o script e passando para o bash como arquivo stdin. Eu gostaria de executar este script com argumentos adicionais print.

Talvez algo assim?

curl -fsSL http://git.io/vvZMn | bash -- print

Mas isso não funciona.

k06a
fonte
4
O que você espera printfazer aqui? Exibir os comandos que estão sendo executados? Se sim, tente bash -x. Nota: essa curl | bashrotina é uma enorme falha de segurança; você não vê o que será executado até que seu servidor seja instalado.
Stephen Harris

Respostas:

16

Acredito que o que você está procurando é a -sopção. Com -s, você pode passar argumentos para o script.

Como um exemplo fictício para ilustrar isso:

$ echo 'echo 1=$1' | bash -s -- Print
1=Print

Aqui, você pode ver que o script fornecido no stdin recebe o parâmetro posicional Print. Seu script usa um -u UUIDargumento e isso também pode ser acomodado:

$ echo 'echo arguments=$*' | bash -s -- -u UUID print
arguments=-u UUID print

Então, no seu caso:

curl -fsSL http://git.io/vvZMn | bash -s -- print

Ou,

curl -fsSL http://git.io/vvZMn | bash -s -- -u UUID print

Como Stephen Harris apontou, baixar um script e executá-lo, sem ser visto, é uma preocupação de segurança.

John1024
fonte
3

Se o seu sistema possui /dev/stdin, você pode usar

$ echo 'echo 1=$1' | bash /dev/stdin print
1=print

Você não fazer isso:

$ echo 'echo 1=$1' | bash /dev/stdin -- print
1=--

Se você deseja usar --, faça o seguinte:

$ echo 'echo 1=$1' | bash -- /dev/stdin print
1=print
G-Man diz que 'restabelece Monica'
fonte