Quel est l'avantage d'utiliser bash -c par rapport à l'utilisation d'une chaîne here?

11

Y a-t-il un réel avantage à utiliser bash -c 'some command'plutôt qu'à utiliserbash <<< 'some command'

Ils semblent obtenir le même effet.

yosefrow
la source
Salut @ Patrick merci pour l'avis. Je ne savais vraiment pas où était le meilleur endroit pour poster. Depuis, d'une part, c'est une question Linux, mais d'autre part bash est une sorte de langage de script et l'autre site a plus de visiteurs. Dans un cas comme celui-ci, où serait l'endroit le plus approprié pour publier?
yosefrow
4
@yosefrow: L'un ou l'autre site aurait été très bien à mon humble avis; mais le crossposting est désagréable (vous demandez aux gens sur les deux sites de passer du temps sur votre question, sans leur donner le bénéfice des réponses des uns et des autres).
ruakh
Serait-il alors approprié de supprimer le message de l'un des sites?
yosefrow
2
Une autre différence mineure est que bash -c '...'cela fonctionnera dans des coquilles qui n'ont pas de chaînes de caractères. Vous supposez que bash sera appelé dans un shell bash mais ce ne sera pas toujours le cas.
Joel Cornett

Réponses:

21

bash -c 'some command'conserve l'accès à l'entrée standard de l'appelant, de sorte que la readlecture des commandes à partir de l'entrée standard fonctionnera normalement. bash <<< 'some command'remplace cette entrée par la ligne transmise, donc bash -c catet bash <<< catfaites des choses différentes.

$ bash -c cat
abc
abc
^D
$ bash <<< cat
$

D'un autre côté, vous pouvez utiliser cette fonctionnalité pour fournir votre propre entrée standard à utiliser $'...', si vous êtes très prudent:

$ bash <<< $'read x y\nabc def ghi\necho $y'
def ghi
$

Je ne voudrais pas me fier à cela, mais cela pourrait être pratique parfois.


bash -cpermet également de passer des arguments au script et $0de les définir:

bash -c 'some command' sh abc def

sera réglé $1vers abcet $2vers l' defintérieur some command.

Michael Homer
la source
3
Les erreurs de syntaxe produiront également une formulation légèrement différente. Principalement que bash -cceux mentionnés -c, AFAIK. Pas entièrement inutile, car cela peut aider à les retrouver. bash <<< 'script'les erreurs ressemblent à celles du script parent; bash -c 'script'd'autres non. Vous pouvez même les étiqueter: bash -c 'script' label.
derobert
Eh bien, bash <<< 'echo $1' /dev/stdin foofonctionne aussi et imprime foo. Bien que le réglage $0soit un peu plus limité.
ilkkachu
bash <<< 'echo "$1"' /dev/stdin foone fonctionne pas toujours. Je dois bash <<< 'echo "$1"' -s footravailler.
G-Man dit `` Réintègre Monica '' le