Was ist der Befehl sh -c?

30

Ich habe den sh -cBefehl entdeckt. Ich habe es gefunden, bevor ich es hier gepostet habe, aber ich kann keine Beiträge von Google finden, die es erklären. Daher möchte ich wissen, was es ist und wie seine vollständige Syntax lautet.

Lan ...
quelle

Antworten:

34

shRuft das Programm shals Interpreter auf und das -cFlag bedeutet, dass der folgende Befehl ausgeführt wird, wie er von diesem Programm interpretiert wird.

In Ubuntu shwird in der Regel mit symbolisiert /bin/dash, was bedeutet, dass, wenn Sie einen Befehl mit sh -cder Dash-Shell ausführen, der Befehl anstelle von bash ausgeführt wird. shWelche Shell mit aufgerufen wird, hängt vom Symlink ab - das können Sie mit herausfinden readlink -e $(which sh). Sie sollten verwenden, sh -cwenn Sie einen Befehl speziell mit dieser Shell anstelle von bash ausführen möchten.

Sie können diese Syntax (das -cFlag) auch für andere Interpreter verwenden. Eine klassische Verwendung davon (von @edwinksl hervorgehoben) ist, das Problem der Umleitung zu umgehen , das nicht mit sudo funktioniert (hier könnten Sie bash -coder verwenden sh -c).

sudo sh -c 'echo "foo" > /home/bar'

schreibt die Datei, bardie den Text enthält, fooan /home/, während sudo echo "foo" > /home/bardies, wie hier sehr gut erklärt , fehlschlägt

Es ist wichtig, die Befehlszeichenfolge in einfache Anführungszeichen zu setzen, da die aktuelle Shell sonst versucht, sie zu erweitern, bevor sie an den aufgerufenen Interpreter übergeben wird

zum Beispiel (mit Python, bis ich an einen Befehl denke, der in Strichen unterschiedliche Ergebnisse liefert ...)

$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
Zanna
quelle
Können Sie ein Beispiel für die Verwendung geben sh -c? Wäre besonders schön, wenn es die Zuordnung von Positionsparametern demonstriert, die im -cTeil von erwähnt werden man sh.
Edwinksl
15

Das -cArgument lautet:

Lesen Sie die Befehle vom Operanden command_string anstelle der Standardeingabe. Der Sonderparameter 0 wird aus dem Operanden befehlsname und die Positionsparameter ($ 1, $ 2 usw.) aus den übrigen Argumentoperanden gesetzt.

Weitere Details zu den shArugments finden Sie unter:

$ man sh

Ein Beispiel für die Verwendung eines Strings als Argument ist:

$ sh -c "echo This is a test string"

Dies ist ein ausführlicheres sh -cBeispiel. Es wird ein Dokument von Google Drive heruntergeladen und zur Bearbeitung auf dem Desktop geöffnet:

$ 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"
LD James
quelle
11

sh -cerzeugt eine nicht-Login , nicht-interaktive Sitzung von sh( dashin Ubuntu).

Der Befehl folgt, in dieser Shell - Sitzung ausgeführt werden wird, wird es als Argument (Positionsparameter) behandelt werden , 0 ( ARGV0) und der verbleibende Teil als das Argument zu diesem Befehl ( ARGV0), ausgehend von 1 ( ARGV1, ARGV2, ...).

Sie können auch typische Shell-Funktionen verwenden, die in dieser Art von Sitzung ausgeführt werden dürfen, z. B. die Befehlstrennung mithilfe ;von mehreren Befehlen, die Befehlsgruppierung mithilfe von {}, das Erzeugen einer weiteren Subshell mit ()usw. Die Verwendung dieser kann die zuvor erwähnten Argumentdefinitionen / -beispiele geringfügig ändern.


Zu beachten ist, dass die Funktionen, die nur für interaktive Shells gelten (standardmäßig), z. B. Verlaufserweiterung, source-en von ~/.bashrcund /etc/bash.bashrcusw., in dieser Sitzung nicht verfügbar sind, da sie nicht interaktiv sind . Sie können ein interaktives Sitzungsverhalten (fast) simulieren, indem Sie die folgende -iOption verwenden:

sh -ic ...

Ebenso werden die Funktionen, die nur für Login- Shells spezifisch sind (standardmäßig), z. B. source-ing von ~/.profile(angegeben ~/.bash_profileund ~/.bash_loginnicht vorhanden) /etc/profile, nicht ausgeführt, da die Shell keine Login- Shell ist. Sie können das Verhalten von Login-Shells mithilfe der folgenden -lOption simulieren :

sh -lc ...

So simulieren Sie Anmeldesitzungen und interaktive Sitzungen:

sh -lic ...
heemayl
quelle
+1 "sh -c erzeugt eine nicht-Login, nicht-interaktive Sitzung von sh"
JSON C11