Bash-For-Schleife – können die Befehle in der Schleife zum Verlauf der Shell hinzugefügt werden?

Bash-For-Schleife – können die Befehle in der Schleife zum Verlauf der Shell hinzugefügt werden?

Wenn ich im Bash-Terminal die folgende For-Schleife ausführe:

 for i in {1..5}; do echo $i;  done

Die echoBefehle werden nicht zum Verlauf der aktuellen Shell hinzugefügt. Liegt das daran, dass die Befehle in for (im doAbschnitt) 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 forgerade „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 5echo 4echo 1

Warum?

Antwort1

Ihr Skript würde den Verlauf überhaupt nicht in ~/.bash_history speichern, es sei denn, Sie exportieren $HISTFILEihn vor dem Ausführen. Wie es in diesem Artikel heißt, man bashliegt dies daran:

Wenn HISTFILE nicht festgelegt ist oder die Verlaufsdatei nicht beschreibbar ist, wird der Verlauf nicht gespeichert.

HISTFILEist 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 HISTCONTROLeinstellen , 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.ignorespaceignorebothignorespaceignoredups

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 HISTCONTROLenthält . All dies wird im Abschnitt in der Bash-Manpage beschrieben, mit dem Sie es auf Ihrem System aufrufen können.ignoredupsignorebothHISTCONTROLman bash

verwandte Informationen