/ / Passer des arguments à un script appelé avec bash -c - linux, bash, shell, unix, sh

Passer des arguments à un script appelé avec bash -c - linux, bash, shell, unix, sh

Je teste un script Bash que j'ai créé sur GitHub correct du comportement (par exemple, qu’il analyse correctement les options). Je souhaite le faire sans avoir à cloner le référentiel localement. Voici comment je le fais:

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

Ma question est, comment puis-je passer des arguments au script en question? j'ai essayé bash -c --help, mais cela n’a pas fonctionné car il a été interprété dans le cadre du script.

Merci!

Réponses:

2 pour la réponse № 1

En fait, vous compliquez exagérément les choses en utilisant xargs avec Bash’s -c option.

Téléchargez le script directement

Vous n'avez pas besoin de cloner le référentiel pour exécuter le script. Il suffit de le télécharger directement:

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

Maintenant qu’il est téléchargé en tant que gid, vous pouvez l’exécuter en tant que script Bash, par exemple,

bash gid --help

Vous pouvez également rendre le script téléchargé exécutable afin de l’exécuter en tant que fichier de script Unix standard (à l’aide de son shebang, #!/bin/bash):

chmod +x gid
./gid --help

Utiliser la substitution de processus

Si vous souhaitez exécuter le script sans l'enregistrer dans un fichier, vous pouvez utiliser la substitution de processus Bash:

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

2 pour la réponse № 2

Je vais faire écho aux commentaires d’Anthony - il est beaucoup plus logique de télécharger le script et de l’exécuter directement, mais si vous êtes vraiment décidé à utiliser la -c option pour bash, c’est un peu compliqué, le problème est que lorsque vous le faites:

something | xargs -0 bash -c

il n’ya aucune occasion de passer des arguments. Ils sont tous avalés comme argument de -c - il est essentiellement transformé en:

bash -c "$(something)"

donc si vous placez quelque chose après le -c dans les xargs, cela passe avant le quelque chose. Il n’ya aucune possibilité de mettre quoi que ce soit après quelque chose, car xargs ne vous le permet pas.

Si vous voulez passer des arguments, vous devez utiliser l'option de position de substitution pour xargs, ce qui vous permet de placer où va l'argument. L'option est -J <item>, et la prochaine chose à réaliser est que le premier argument sera $0, vous devez donc faire:

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

Je peux imiter cela avec:

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

qui donne:

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