J'ai découvert le sh -c
commande. Je l'ai trouvée avant de poster ici, mais je ne trouve aucun article de Google qui l'explique. J'aimerais donc savoir ce que c'est et quelle est sa syntaxe complète.
Réponses
Trop de publicités?sh
appelle le programme sh
comme interprète et le -c
flag signifie exécuter la commande suivante telle qu'interprétée par ce programme.
Dans Ubuntu, sh
est généralement lié par un lien symbolique à /bin/dash
ce qui signifie que si vous exécutez une commande avec l'option sh -c
le tiret Shell sera utilisé pour exécuter la commande au lieu de bash. Le Shell appelé avec le paramètre sh
dépend du lien symbolique - vous pouvez le découvrir avec readlink -e $(which sh)
. Vous devez utiliser sh -c
lorsque vous voulez exécuter une commande spécifiquement avec ce Shell au lieu de bash.
Vous pouvez utiliser cette syntaxe (le -c
) avec d'autres interprètes également. Une utilisation classique (signalée par @edwinksl) est de contourner le problème de la redirection qui ne fonctionne pas avec sudo (ici, vous pouvez utiliser bash -c
o sh -c
)
sudo sh -c 'echo "foo" > /home/bar'
écrira le fichier bar
contenant le texte foo
a /home/
alors que 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 la développer avant qu'elle ne soit passée à l'interprète que vous avez appelé. Par exemple avec python
:
$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
Le site -c
l'argument est :
Lire les commandes à partir de l'opérande command_string au lieu de l'opérande entrée standard. Le paramètre spécial 0 sera défini à partir de l'opérande command_name et les paramètres positionnels ($1, $2, etc.) seront définis à partir de l'opérande des autres opérandes d'arguments.
D'autres détails de la sh
Les résultats peuvent être trouvés en exécutant :
$ man sh
Voici un exemple d'utilisation d'une chaîne de caractères comme argument :
$ sh -c "echo This is a test string"
Il s'agit d'un document plus détaillé sh -c
exemple. Il téléchargera un document depuis 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
donne naissance à un non-login , non interactif session de sh
( dash
dans Ubuntu).
La commande suivante sera exécutée dans cette session Shell, elle sera traitée comme argument (paramètre positionnel) 0 ( ARGV0
), et la partie restante comme argument de cette commande ( ARGV0
), à partir de 1 ( ARGV1
, ARGV2
, ...).
Vous pouvez également utiliser les fonctionnalités typiques de Shell autorisées à fonctionner dans ce type de session, par exemple la séparation des commandes en utilisant ;
pour utiliser plusieurs commandes, le regroupement de commandes à l'aide de {}
et génère un autre sous-shell avec ()
et ainsi de suite. L'utilisation de ces derniers peut modifier légèrement les définitions/exemples d'arguments mentionnés précédemment.
Il convient de noter que les fonctionnalités spécifiques à l'UE sont les suivantes interactive uniquement les shells (par défaut), par exemple l'expansion de l'historique, source
-de ~/.bashrc
y /etc/bash.bashrc
etc. ne sera pas disponible dans cette session car il est non interactif . Vous pouvez simuler le comportement d'une session interactive (ou presque) en utilisant la fonction -i
option :
sh -ic ...
De même, les caractéristiques propres à connexion uniquement les shells (par défaut), par exemple source
-de ~/.profile
(donné ~/.bash_profile
y ~/.bash_login
n'existent pas) et /etc/profile
ne sera pas fait car le Shell est une non-login Shell. Vous pouvez simuler le comportement des shells de connexion en utilisant la fonction -l
option :
sh -lc ...
Pour simuler à la fois des sessions de connexion et des sessions interactives :
sh -lic ...