Risposte:
sh
chiama il programma sh
come interprete e il -c
flag significa eseguire il comando seguente come interpretato da questo programma.
In Ubuntu, di sh
solito è collegato a symlink /bin/dash
, nel senso che se si esegue un comando con sh -c
la dash dash verrà utilizzato per eseguire il comando anziché bash. La shell chiamata con sh
dipende dal collegamento simbolico - puoi scoprirlo con readlink -e $(which sh)
. Dovresti usare sh -c
quando vuoi eseguire un comando specificamente con quella shell invece di bash.
Puoi usare questa sintassi (il -c
flag) anche con altri interpreti. Un suo uso classico (sottolineato da @edwinksl è quello di aggirare il problema del reindirizzamento che non funziona con sudo (qui puoi usare bash -c
o sh -c
)
sudo sh -c 'echo "foo" > /home/bar'
scriverà il file bar
contenente il testo foo
a /home/
, mentre sudo echo "foo" > /home/bar
fallisce come spiegato molto bene qui
È importante usare "virgolette singole" attorno alla stringa di comando, altrimenti la shell corrente tenterà di espanderla prima che venga passata all'interprete che hai chiamato
per esempio (con Python fino a quando non penso a un comando che darebbe risultati diversi in trattino ...)
$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
L' -c
argomento è:
Leggi i comandi dall'operando command_string anziché dall'input standard. Il parametro speciale 0 verrà impostato dall'operando nome_ comando e i parametri posizionali ($ 1, $ 2, ecc.) Impostati dagli operandi argomento rimanenti.
Altri dettagli degli sh
arugments possono essere trovati eseguendo:
$ man sh
Un esempio di utilizzo di una stringa come argomento è:
$ sh -c "echo This is a test string"
Questo è un sh -c
esempio più dettagliato . Scaricherà un documento da Google Drive e lo aprirà per la modifica sul desktop:
$ 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"
sh -c
genera una sessione senza accesso e non interattiva di sh
( dash
in Ubuntu).
Il seguente comando che verrà eseguito in quella sessione shell, sarà trattata come argomento (parametro posizionale) 0 ( ARGV0
), e la parte rimanente come argomento a quel comando ( ARGV0
), partendo da 1 ( ARGV1
, ARGV2
, ...).
È inoltre possibile utilizzare le funzionalità tipiche della shell che possono essere eseguite in questo tipo di sessione, ad esempio la separazione dei comandi mediante ;
l'utilizzo di più comandi, il raggruppamento dei comandi mediante {}
, la generazione di un'altra subshell con ()
e così via. L'utilizzo di questi può modificare leggermente le definizioni degli argomenti / esempi citati in precedenza.
Solo per notare, le funzionalità specifiche solo per le shell interattive (per impostazione predefinita), ad esempio l'espansione della cronologia, source
-ing ~/.bashrc
ed /etc/bash.bashrc
ecc. Non saranno disponibili in questa sessione in quanto non interattive . Puoi simulare un comportamento di sessioni interattive (quasi), usando l' -i
opzione:
sh -ic ...
Allo stesso modo, le funzionalità specifiche solo per le shell di accesso (per impostazione predefinita), ad esempio source
-ing ~/.profile
(fornite ~/.bash_profile
e ~/.bash_login
non esistono) e /etc/profile
non verranno eseguite poiché la shell è una shell non di accesso . È possibile simulare il comportamento delle shell di accesso utilizzando l' -l
opzione:
sh -lc ...
Per simulare le sessioni di accesso e interattive:
sh -lic ...
sh -c
? Sarebbe molto bello se dimostra l'assegnazione di parametri posizionali che sono menzionati nella-c
parte diman sh
.