Réponses:
sh
appelle le programme en sh
tant qu'interprète et l' -c
indicateur signifie exécuter la commande suivante telle qu'interprétée par ce programme.
Dans Ubuntu, sh
est généralement associé à un lien symbolique /bin/dash
, ce qui signifie que si vous exécutez une commande avec sh -c
le shell de tiret, elle sera utilisée pour exécuter la commande au lieu de bash. Le shell appelé avec sh
dépend du lien symbolique - vous pouvez le découvrir avec readlink -e $(which sh)
. Vous devez utiliser sh -c
lorsque vous souhaitez exécuter une commande spécifiquement avec ce shell au lieu de bash.
Vous pouvez également utiliser cette syntaxe (l' -c
indicateur) avec d'autres interprètes. Une utilisation classique de celui-ci (souligné par @edwinksl est de contourner le problème de la redirection ne fonctionnant pas avec sudo (ici vous pouvez utiliser bash -c
ou sh -c
)
sudo sh -c 'echo "foo" > /home/bar'
va écrire le fichier bar
contenant le texte foo
à /home/
, tout sudo echo "foo" > /home/bar
échoue comme expliqué très bien ici
Il est important d'utiliser des `` guillemets simples '' autour de la chaîne de commande, sinon le shell actuel essaiera de le développer avant qu'il ne soit transmis à l'interpréteur que vous avez appelé
par exemple (avec python jusqu'à ce que je pense à une commande qui donnerait des résultats différents en tiret ...)
$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
L' -c
argument est:
Lisez les commandes de l'opérande command_string plutôt que de l'entrée standard. Le paramètre spécial 0 sera défini à partir de l'opérande nom_commande et les paramètres positionnels ($ 1, $ 2, etc.) définis à partir des opérandes d'arguments restants.
D'autres détails sur les sh
arugments peuvent être trouvés en exécutant:
$ man sh
Un exemple d'utilisation d'une chaîne comme argument est:
$ sh -c "echo This is a test string"
Ceci est un sh -c
exemple plus détaillé . Il téléchargera un document à partir de Google Drive et l'ouvrira pour le modifier sur le bureau:
$ sh -c "wget 'https://docs.google.com/document/u/0/d/1jcBtdlMx0f4BhCmAmnIViIy4WN4oRevWFRzse-P00j0/export?format=docx' -O test.docx && xdg-open test.docx 2>/dev/null"
sh -c
génère une session sans connexion et non interactive de sh
( dash
dans Ubuntu).
La commande suivante qui sera exécutée dans ladite session de coque, il sera traité comme argument (paramètre de position) 0 ( ARGV0
), et la partie restante comme argument de cette commande ( ARGV0
), à partir de 1 ( ARGV1
, ARGV2
, ...).
Vous pouvez également utiliser des fonctionnalités de shell typiques autorisées à s'exécuter dans ce type de session, par exemple la séparation de commandes à l'aide ;
de plusieurs commandes, le regroupement de commandes à l'aide de {}
, la génération d'un autre sous-shell avec ()
, etc. Leur utilisation peut légèrement modifier les définitions / exemples d'arguments mentionnés précédemment.
Juste à noter, les fonctionnalités qui sont spécifiques aux shells interactifs uniquement (par défaut), par exemple l'expansion de l'historique, source
-ing ~/.bashrc
et /etc/bash.bashrc
etc ne seront pas disponibles dans cette session car elles ne sont pas interactives . Vous pouvez simuler un comportement de sessions interactives (presque) en utilisant l' -i
option:
sh -ic ...
De même, les fonctionnalités spécifiques aux shells de connexion uniquement (par défaut), par exemple source
-ing de ~/.profile
(données ~/.bash_profile
et ~/.bash_login
n'existent pas) et /etc/profile
ne seront pas effectuées car le shell est un shell sans connexion . Vous pouvez simuler le comportement des shells de connexion en utilisant l' -l
option:
sh -lc ...
Pour simuler à la fois la connexion et les sessions interactives:
sh -lic ...
sh -c
? Ce serait très bien s'il démontre l'attribution des paramètres de position mentionnés dans la-c
partie deman sh
.