
Wenn ich im Bash-Terminal die folgende For-Schleife ausführe:
for i in {1..5}; do echo $i; done
Die echo
Befehle werden nicht zum Verlauf der aktuellen Shell hinzugefügt. Liegt das daran, dass die Befehle in for (im do
Abschnitt) in der Subshell ausgeführt werden? Wenn ja, gibt es eine Möglichkeit, sie stattdessen in der aktuellen Shell auszuführen? Oder ist das nicht möglich, weil sie for
gerade „ausgeführt“ wird?
Bearbeiten: Wenn die gesamte For-Schleife als ein einziger zusammengesetzter Befehl ausgeführt wird, sollten dann nicht alle fünf zum Verlauf hinzugefügt werden, wenn ich die For-Schleife entferne und die einzelnen Befehle in fünf Zeilen schreibe?
Ich habe Folgendes gemacht:
#!/bin/bash
set -o history
var=5
echo $((var--))
echo $((var--))
echo $((var--))
echo $((var--))
echo $((var--))
und habe das Skript mit ausgeführt source
. Im Verlauf wird immer noch nur eine Echo-Anweisung und nicht alle fünf angezeigt echo $((var--))
. Wenn ich hingegen statt fünf fünf , , ...- Befehle echo $((var--))
eingebe, werden alle fünf zum Verlauf hinzugefügt.echo 5
echo 4
echo 1
Warum?
Antwort1
Ihr Skript würde den Verlauf überhaupt nicht in ~/.bash_history speichern, es sei denn, Sie exportieren $HISTFILE
ihn vor dem Ausführen. Wie es in diesem Artikel heißt, man bash
liegt dies daran:
Wenn HISTFILE nicht festgelegt ist oder die Verlaufsdatei nicht beschreibbar ist, wird der Verlauf nicht gespeichert.
HISTFILE
ist keine Umgebungsvariable, sondern eine Shell-Variable und daher nicht in Skripten verfügbar, die untergeordnete Prozesse sind. Und selbst wenn Sie diese Befehle ausführen
$ var=5
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
(Beachten Sie die Leerzeichen nach der Eingabeaufforderung) In einer interaktiven Sitzung und nicht in einem Skript würden sie in der Praxis auch nicht in ~/.bash_history gespeichert, da beliebte Linux-Distributionen wie Ubuntu oder (ein Alias für und ) so HISTCONTROL
einstellen , dass Befehle, die mit einem oder mehreren Leerzeichen beginnen, nicht gespeichert werden. Dies ist insbesondere dann nützlich, wenn Sie auf einem gemeinsam genutzten Server mit anderen Benutzern arbeiten und einen bestimmten Befehl absichtlich nicht im Verlauf speichern möchten, damit andere ihn sehen können, beispielsweise weil er Ihr Passwort oder andere vertrauliche Informationen enthält.ignorespace
ignoreboth
ignorespace
ignoredups
Aber auch wenn vor dem Befehl keine Leerzeichen stünden:
$ var=5
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
echo $((var--))
Sie würden höchstwahrscheinlich nur einen einzigen Eintrag in ~/.bash_history erhalten, da dieser normalerweise oder das oben genannte HISTCONTROL
enthält . All dies wird im Abschnitt in der Bash-Manpage beschrieben, mit dem Sie es auf Ihrem System aufrufen können.ignoredups
ignoreboth
HISTCONTROL
man bash