Ich habe ein Bash-Skript, das ich erstellen wollte, um einen ziemlich komplexen Befehl mit kleinen Änderungen auszuführen, nach denen ich durch Echo und Lesen gefragt werde.
Ich habe Lösungen gefunden, um es zu zwingen, ein Terminal auszuführen, um den Befehl auszuführen, aber das interessiert mich nicht. Was ich tun möchte, ist, wenn ich in Nautilus die Leertaste drücke und einfach die Eingabetaste drücke (damit es mit Run Software ausgeführt wird), wird nur eine Benachrichtigung mit der Meldung "Bitte führen Sie dies von einem Terminal aus."
Ich kann das Popup aktivieren - wie ich den Befehl kenne -, aber ich kann das Bash-Skript nicht dazu bringen, festzustellen, ob es in einem Terminal ausgeführt wird oder nicht, es scheint immer so zu sein. Ist es überhaupt möglich?
||
in der[ … ]
Art? Wenn Sie[[ … ]]
dann verwenden, wäre es in Ordnung, aber normalerweise wird das||
verwendet, um Befehle zu trennen, und[ -t 0
ist ein falscher Aufruf von,[
weil sein letzter]
fehlt. Normalerweise gibt es auch keinen Befehl-p
. Ich bin mit dem Testen eines Terminals einverstanden. das ist wahrscheinlich der Weg, es zu tun. Es ist nur die Syntax, um die ich mir Sorgen mache.||
vor dem erforderlichen endgültigen]
Argument für angezeigt wird[
.PS1
ist kein zuverlässiger Test, um festzustellen, ob die Shell interaktiv ist. "Wenn ein Skript testen muss, ob es in einer interaktiven Shell ausgeführt wird", ist ebenfalls verwirrend: Es sollte sein, wenn Code getestet werden muss - ein Skript wird normalerweise nicht in einer interaktiven Shell ausgeführt (kann es aber sein, wenn es aus Quellen stammt). . Das Testen aufi
in$-
ist der richtige Weg, um zu testen, ob die Shell interaktiv ist. Testen-t 0
oder-t 2
ist der richtige Weg, um festzustellen, ob das Skript in einem Terminal ausgeführt wird, das sich von der interaktiven unterscheidet.Verwenden Sie die Variable bash $ SHLVL, um die Ebene der Shell-Verschachtelung zu ermitteln. In einem Skript, das 'raw' durch Doppelklicken ausführt, ist es 1, in einem Skript, das in einem Terminal ausgeführt wird, ist es 2.
quelle
Obwohl die Antwort von Goldlöckchen im typischen Fall wahrscheinlich richtig ist, scheint es Randfälle zu geben. In meinem Fall ist mein xserver für den Start konfiguriert
tty1
und verlässt diesen tty nie. Wenn Xorgsstdout
ein TTY ist, scheint es, dass die Clients dieses TTY standardmäßig mit ihrem Dateideskriptor verknüpft haben.So habe ich mein Problem gelöst:
Ich habe dies nicht getestet, um festzustellen, ob es mit einer Standard-X-Konfiguration funktioniert, und ich bezweifle auch sehr, dass dies der einzige Randfall ist. Wenn jemand eine allgemeinere Lösung findet, kommen Sie bitte zurück und teilen Sie uns dies mit.
quelle
Eine andere, die die Bash-Optionen verwendet, setzt die interne Variable
$-
.Von
.bashrc
,quelle
cmd | sh -i | cmd
.