Risposte:
shchiama il programma shcome interprete e il -cflag significa eseguire il comando seguente come interpretato da questo programma.
In Ubuntu, di shsolito è collegato a symlink /bin/dash, nel senso che se si esegue un comando con sh -cla dash dash verrà utilizzato per eseguire il comando anziché bash. La shell chiamata con shdipende dal collegamento simbolico - puoi scoprirlo con readlink -e $(which sh). Dovresti usare sh -cquando vuoi eseguire un comando specificamente con quella shell invece di bash.
Puoi usare questa sintassi (il -cflag) 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 -co sh -c)
sudo sh -c 'echo "foo" > /home/bar'
scriverà il file barcontenente il testo fooa /home/, mentre sudo echo "foo" > /home/barfallisce 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' -cargomento è:
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 sharugments 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 -cesempio 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 -cgenera una sessione senza accesso e non interattiva di sh( dashin 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 ~/.bashrced /etc/bash.bashrcecc. Non saranno disponibili in questa sessione in quanto non interattive . Puoi simulare un comportamento di sessioni interattive (quasi), usando l' -iopzione:
sh -ic ...
Allo stesso modo, le funzionalità specifiche solo per le shell di accesso (per impostazione predefinita), ad esempio source-ing ~/.profile(fornite ~/.bash_profilee ~/.bash_loginnon esistono) e /etc/profilenon verranno eseguite poiché la shell è una shell non di accesso . È possibile simulare il comportamento delle shell di accesso utilizzando l' -lopzione:
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-cparte diman sh.