Qual è il comando sh -c?


31

Ho scoperto il sh -ccomando. L'ho trovato prima di pubblicare qui, ma non riesco a trovare alcun post di Google che lo spieghi, quindi vorrei sapere di cosa si tratta e qual è la sua sintassi completa.

Risposte:


34

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

Potete fornire un esempio di come usare sh -c? Sarebbe molto bello se dimostra l'assegnazione di parametri posizionali che sono menzionati nella -cparte di man sh.
edwinksl,

15

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"

11

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 ...

+1 "sh -c genera una sessione non login e non interattiva di sh"
JSON C11
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.