Unterschied zwischen Befehlen im Bash-Skript und Befehlen im Terminal


Antworten:


7

Ihr Terminal führt (höchstwahrscheinlich bash) eine Shell aus , die nach Ihren Befehlen fragt und diese ausführt.

Neben diesem interaktiven Modus können Sie mit Ihrer Shell auch Befehle aus einer Datei ausführen. Um die Befehle in Ihrer Datei auszuführen, können Sie entweder die Shell direkt aufrufen bash scriptoder Ihre Datei mit einem "shebang" starten #!/bin/bashund ausführbar machen ( chmod +x script). Dann können Sie das Skript wie eine Binärdatei behandeln und es beispielsweise wie ./scriptfolgt ausführen oder an einer Stelle ablegen, an der Ihre Shell danach sucht. ( echo $PATH)

Höchstwahrscheinlich ist sowohl Ihre interaktive Shell als auch die zum Ausführen verwendete Shell bash. Aus der Sicht eines "first day learning linux" funktioniert bash in beiden Modi genau gleich. - Viel später könnten Sie über geringfügige Unterschiede stolpern. Wenn Sie wirklich detaillierte Informationen benötigen, empfehle ich Ihnen, man bashnach Orten zu suchen, in denen "interaktiv" vorkommt. (Sie können eine Manpage durchsuchen, indem Sie drücken /.)

Eine wichtige Anmerkung ist, dass das Skript als neuer Prozess ausgeführt wird. Dies bedeutet insbesondere, dass im Skript gesetzte Variablen in der aufrufenden Shell nicht sichtbar sind.

$ export a=1
$ echo $a
1
$ bash -c 'echo $a;a=2;echo $a' # change the value in a script
1
2
$ echo $a # value not changed here
1
$ 

Ohne den Export aist nicht einmal das innere Skript sichtbar.


1

Im Allgemeinen würde die Antwort "nein" lauten, Befehle in der Shell sind in Skripten, in der Syntax und in der Semantik identisch.

Es gibt jedoch eine Reihe kleiner Nuancen in Bezug auf die Konfiguration der Umgebung (welche Variablen werden verwendet und welche festgelegt).

  • die interaktive Shell für Linux ist bash, aber Scripting verwendet häufig andere Dolmetscher ( sh, die ein Vorgänger von ist bash, ksh, die auf einer Stufe mit bash ist), so dass Sie zu berücksichtigen haben , welche Shell benutzt wird (das aktuell Shell Namen wird traditionell in Variable gehalten SHELL, versuchen Sie es mit der Eingabe echo $SHELL).

  • Möglicherweise gibt es Unterschiede in der Konfiguration desselben Interpreters für die interaktive Sitzung und für die Skriptausführung.


-1

Nein. Ein Skript ist eine Liste von Befehlen, die Sie im Terminal eingeben können.

Sie können die Gesamtheit eines Skripts in das Terminal einfügen. Das Ergebnis entspricht dem Ausführen des Skripts.

Umgekehrt können Sie Ihre Terminalbefehle in einer Datei "speichern" und in ein wiederverwendbares Skript verwandeln und mit Ihrer Familie und Freunden teilen.


4
Das Einfügen des Inhalts entspricht dem Aufrufen des Skripts. Dies ändert alle Arten von Optionen in der aktuellen Shell, die nicht durch einfaches Ausführen des Skripts geändert würden.
Michas

Du hast Recht. aber soweit seine fragen gehen. Ich denke, wir können sagen, dass es ziemlich ähnlich ist. aber ja, um zu übersetzen, was michas in noob'er Ausdrücken sagte. Das Einfügen des Skriptinhalts ist äquivalent zu do source script_file. Hiermit werden die ENV-Variablen im aktuellen Kontext bearbeitet. Wenn Sie das Skript ./script_fileausführen, ändert as nicht die ENV, es exportsei denn, dies wird explizit verwendet.
Mathieu J.

1
Nein. Trotzdem exportkann ein Skript keine Variablen der aufrufenden Shell ändern. Gleiches gilt für Dinge wie PWD, definierte Aliase, Funktionen und ähnliches. Sie können nur interaktiv oder durch Beschaffung einer Datei geändert werden. Aber ja, das ist wahrscheinlich nichts, worüber jemand am ersten Tag stolpern wird. :)
michas

1
@michas: Naja, es ist immer noch besser, die richtige Beschreibung zu geben. Wenn der Anfänger ehrgeizig ist und Arbeitsgewohnheiten hat, wird er oder sie schnell lernen. Wenn wir versuchen, die Geschichte des Kindes zu erzählen, stolpern wir einfach über unsere Füße und hinterlassen einen unverständlichen Eindruck - außerdem ist der Anfänger möglicherweise später zurück. Obwohl ich mich nicht als Anfänger betrachte, gibt es eine Menge Dinge, die ich nicht kenne, und ich wäre beleidigt, wenn jemand meine Fragen nicht beantworten würde, weil "Sie sind noch nicht da, Junior".
Emanuel Berg
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.