Bash-Optionen und interaktive Shells

Die Option -s zum Bash scheint nichts zu tun

Wenn ich Befehle mit oder ausführe ohne es ändert sich nichts. Was mich wirklich verwirrt, ist, wenn ich ein Shell-Skript ausführe, dass ich immer eine interaktive Shell bekomme. Ich gehe davon aus, dass es interaktiv ist, denn wenn ich das im Skript integrierte Lesen verwende, werde ich immer dazu aufgefordert Eingabe. Macht es dies interaktiv?

Wird das Shell-Skript in Fedora als interaktiv ausgeführt, und gibt es Beispiele für einen Unterschied, den das -s bewirken kann? Ich habe die Manpages gelesen, kann es aber nicht scheinen selbst irgendwelche Beispiele zu generieren, die irgendeine Wirkung haben würden. Ich habe die beiden Fragen kombiniert, weil ich versucht habe, mit s zu ändern, wie das Skript Eingaben erhalten hat, und in einigen Tutorials heißt es, dass es Auswirkungen hat. Mir ist klar, dass es Argumente setzen kann. Was ich nicht verstehe, ist, wie es es ändert, um es von der Standardeingabe zu lesen. Es scheint sowieso immer so zu sein.

Hier ist, was ich verwendet habe, um es zu testen

if [ -v $PS1 ] then echo non-interactive else echo interactive fi read ; echo $REPLY 

read konnte immer sowohl in nicht als auch in interaktiven Shells funktionieren

Selbst wenn ich auf das Vorhandensein von fd / 0 und fd / 1 in getestet habe Nicht interaktive Shells existierten noch.

Vielen Dank im Voraus.

Antwort

Bash bestimmt auch, ob oder Es ist nicht interaktiv, indem geprüft wird, ob seine Ein- / Ausgabe an ein Terminal angeschlossen ist.

Mit dem nicht interaktiven Schalter -s kann das Bash-Skript Positionsparameter verarbeiten, wenn Lesen von Befehlen aus einer Datei, z. B.:

$ cat demo.sh echo "$0 = " $0 echo "$1 = " $1 echo "$2 = " $2 $ bash < demo.sh foo bar bash: foo: No such file or directory $ bash -s < demo.sh foo bar $0 = bash $1 = foo $2 = bar 

Antwort

Die -s bewirkt, dass bash Befehle aus seiner Standardeingabe liest. Ohne diese Option behandelt bash sein erstes Argument als den Namen eines auszuführenden Skripts Mit der Option Bash werden alle Argumente als Argumente für das Skript behandelt, das bei Standardeingaben gelesen wird. Die Option -s bestimmt nur, wie bash seine Befehlszeilenargumente interpretiert, nicht, ob die Shell-Instanz interaktiv ist.

Eine Instanz von bash ist immer interaktiv, wenn sie gestartet wird mit der Option -i. Ohne -i ist es nur dann interaktiv, wenn kein Skriptname übergeben wird (-s beeinflusst dies) und sowohl Standardeingabe als auch Standardfehler verbunden sind ein Terminal.

Beim Testen von PS1 wird nicht angegeben, ob eine Shell-Instanz interaktiv ist.¹ Sie können PS1 deaktivieren in einer interaktiven Shell. Umgekehrt erbt eine nicht interaktive Shell häufig PS1 von ihrer Umgebung. Der zuverlässige Weg, um zu testen, ob die Shell interaktiv ausgeführt wird, besteht darin, zu testen, ob $- i enthält.

Das read integriert funktioniert von jeder Shell aus, interaktiv oder nicht. Es liest von allem, was mit der Standardeingabe der Shell verbunden ist (sofern nicht umgeleitet). Wenn Sie versuchen, aus demselben Dateideskriptor zu lesen, in dem bash das Skript liest, das es ausführt, überspringen Sie am Ende eine Zeile im Skript (nicht unbedingt an der Stelle, die Sie beabsichtigt haben): Wenn Sie beispielsweise ein Skript für die Standardeingabe von bash übergeben und eine Zeile vom Terminal lesen möchten, müssen Sie die read Aufruf: read line </dev/tty.

Die Dateideskriptoren 0, 1 und 2 sind immer vorhanden (sofern sie nicht geschlossen wurden). Sie sind Standardeingabe, Standardausgabe bzw. Standardfehler. Ob die Shell interaktiv ist oder nicht, hängt nicht davon ab, worauf die Standarddeskriptoren verweisen, außer dass die Tatsache, ob fd 0 und 2 Terminals sind, den interaktiven Status der Shell beeinflusst.

¹ Ja, ich bin Beachten Sie, dass es Webseiten gibt, die dies behaupten. Sie sind falsch.

Antwort

Weitere Informationen zu interaktiven Shells:

Sie können herausfinden, ob eine Shell interaktiv ist oder nicht, indem Sie $- überprüfen. Wenn $- eine i, dann ist die Shell interaktiv.

Eine Shell ist interaktiv, wenn sie die Eingaben des Benutzers direkt liest. Eine nicht interaktive Shell liest Befehle Zeile für Zeile aus einer Datei und führt sie aus „macht die Shell nicht interaktiv, wenn etwas aus stdin aus dem Skript gelesen wird, da“ das Skript die Eingabe liest, nicht die Shell „(weiß nicht, wie man das besser erklärt).

 labdebian# cat ./test #!/bin/bash echo Hello World echo $- read; echo $REPLY echo $- labdebian# bash test Hello World hB I"m typing this I"m typing this hB labdebian# bash -i test Hello World himB I"m typing this I"m typing this himB 

Kommentare

  • Was verwirrend war, ist in der Dokumentation für Bash angegeben, dass es hängen bleibt, wenn Sie read in a non – verwenden. interaktive Shell

Antwort

-s macht Ihre nicht Shell interaktiv. Verwenden Sie stattdessen -i.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.