/ / Passare argomenti a uno script richiamato con bash -c - linux, bash, shell, unix, sh

Passare argomenti a uno script invocato con bash -c - linux, bash, shell, unix, sh

Sto testando uno script Bash su cui ho creato GitHub per correttezza comportamentale (ad es. che analizza correttamente le opzioni). Voglio farlo senza dover clonare il repository localmente, quindi ecco come lo sto facendo:

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

La mia domanda è, come posso passare argomenti allo script in questione? Provai bash -c --help, ma non funzionava da quando è stato interpretato come parte della sceneggiatura.

Grazie!

risposte:

2 per risposta № 1

Stai davvero complicando troppo le cose usando xargs con Bash's -c opzione.

Scarica direttamente lo script

Non è necessario clonare il repository per eseguire lo script. Basta scaricarlo direttamente:

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

Ora che è scaricato come gid, puoi eseguirlo come script Bash, ad es.

bash gid --help

Puoi anche rendere eseguibile lo script scaricato per eseguirlo come un normale file di script Unix (usando il suo shebang, #!/bin/bash):

chmod +x gid
./gid --help

Utilizzare la sostituzione del processo

Se si desidera eseguire lo script senza salvarlo in un file, è possibile utilizzare la sostituzione del processo di Bash:

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

2 per risposta № 2

Ricordo i commenti di Anthony - è molto più sensato scaricare lo script ed eseguirlo direttamente, ma se si è veramente pronti ad usare il -c opzione per bash, è un po 'complicato, il problema è che quando lo fai:

something | xargs -0 bash -c

non c'è alcuna possibilità di passare alcun argomento, tutti vengono inghiottiti come argomento -c - Si trasforma essenzialmente in:

bash -c "$(something)"

quindi se metti qualcosa dopo il -c negli xargs, arriva prima di qualcosa. Non c'è alcuna possibilità di mettere qualcosa dopo qualcosa, dato che xargs non te lo consente.

Se vuoi passare argomenti, devi usare l'opzione di posizione di sostituzione per xargs, che ti permette di posizionare dove va l'argomento, L'opzione è -J <item>e la prossima cosa da capire è che il primo argomento sarà $0, quindi devi fare:

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

Posso emulare questo con:

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

che produce:

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