Qual è il vantaggio di usare bash -c rispetto all'uso di una stringa qui?


11

C'è qualche reale vantaggio nell'usare bash -c 'some command'rispetto all'usobash <<< 'some command'

Sembrano ottenere lo stesso effetto.



Ciao @Patrick grazie per l'avviso. Non ero davvero sicuro di dove fosse il posto migliore dove pubblicare. Dal momento che, da un lato, questa è una domanda Linux, ma dall'altro, bash è una specie di linguaggio di scripting e l'altro sito ha più visitatori. In un caso come questo, dove sarebbe il posto più appropriato dove pubblicare?
yosefrow

4
@yosefrow: entrambi i siti sarebbero andati bene IMHO; ma il crossposting è odioso (stai chiedendo alle persone di entrambi i siti di dedicare del tempo alla tua domanda, senza dare loro il beneficio delle risposte reciproche).
Ruakh

Sarebbe appropriato quindi eliminare il post da uno dei siti?
yosefrow

2
Un'altra differenza minore è che bash -c '...'funzionerà nelle shell che non hanno herestring. Supponete che bash verrà chiamato all'interno di una shell bash, ma non sarà sempre così.
Joel Cornett,

Risposte:


21

bash -c 'some command'mantiene l'accesso all'input standard del chiamante, quindi i readcomandi di lettura dall'input standard funzioneranno normalmente. bash <<< 'some command'sostituisce quell'input con la linea che viene passata, quindi bash -c cate bash <<< catfare cose diverse.

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

D'altra parte, potresti fare uso di quella funzione per fornire il tuo input standard da utilizzare $'...', se stai molto attento:

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

Non vorrei fare affidamento su questo, ma a volte potrebbe essere conveniente.


bash -cconsente inoltre di passare argomenti allo script e $0di impostarli:

bash -c 'some command' sh abc def

fisserà $1a abced $2a defdentro some command.


3
Gli errori di sintassi produrranno anche una formulazione leggermente diversa. Principalmente quello bash -cmenzionato -c, AFAIK. Non del tutto inutile, in quanto ciò può aiutare a rintracciarli. bash <<< 'script'gli errori sembrano proprio come quelli nello script principale; bash -c 'script'quelli no. Si può anche etichettarli: bash -c 'script' label.
derobert il

Bene, bash <<< 'echo $1' /dev/stdin foofunziona anche e stampa foo. Sebbene l'impostazione $0sia leggermente più limitata.
ilkkachu,

bash <<< 'echo "$1"' /dev/stdin foonon sempre funziona. Devo bash <<< 'echo "$1"' -s foolavorare.
G-Man dice "Ripristina Monica" il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.