Qu'est-ce que la commande sh -c?


31

J'ai découvert la sh -ccommande. Je l'ai trouvé avant de poster ici, mais je ne trouve aucun message de Google qui l'explique, donc je voudrais savoir de quoi il s'agit et quelle est sa syntaxe complète.

Réponses:


34

shappelle le programme en shtant qu'interprète et l' -cindicateur signifie exécuter la commande suivante telle qu'interprétée par ce programme.

Dans Ubuntu, shest généralement associé à un lien symbolique /bin/dash, ce qui signifie que si vous exécutez une commande avec sh -cle shell de tiret, elle sera utilisée pour exécuter la commande au lieu de bash. Le shell appelé avec shdépend du lien symbolique - vous pouvez le découvrir avec readlink -e $(which sh). Vous devez utiliser sh -clorsque vous souhaitez exécuter une commande spécifiquement avec ce shell au lieu de bash.

Vous pouvez également utiliser cette syntaxe (l' -cindicateur) 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 -cou sh -c)

sudo sh -c 'echo "foo" > /home/bar'

va écrire le fichier barcontenant 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

Pouvez-vous fournir un exemple d'utilisation sh -c? Ce serait très bien s'il démontre l'attribution des paramètres de position mentionnés dans la -cpartie de man sh.
edwinksl

15

L' -cargument 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 sharugments 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 -cexemple 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"

11

sh -cgénère une session sans connexion et non interactive de sh( dashdans 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 ~/.bashrcet /etc/bash.bashrcetc 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' -ioption:

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_profileet ~/.bash_loginn'existent pas) et /etc/profilene seront pas effectuées car le shell est un shell sans connexion . Vous pouvez simuler le comportement des shells de connexion en utilisant l' -loption:

sh -lc ...

Pour simuler à la fois la connexion et les sessions interactives:

sh -lic ...

+1 "sh -c génère une session non-connectée et non interactive de sh"
JSON C11
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.