69 votes

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

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.

61voto

Zanna Points 65764

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

27voto

linuxmaniax Points 21

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"

18voto

heemayl Points 85741

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 ...

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X