J'ai découvert la sh -c
commande. 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.
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
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
.L'
-c
argument est:D'autres détails sur les
sh
arugments peuvent être trouvés en exécutant:Un exemple d'utilisation d'une chaîne comme argument est:
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:la source
sh -c
génère une session sans connexion et non interactive desh
(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: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:Pour simuler à la fois la connexion et les sessions interactives:
la source