Ich denke, ich verstehe die Unterschiede zwischen einer interaktiven, einer Login- und einer Batch-Shell. Weitere Hilfe finden Sie unter den folgenden Links:
- Was ist der Unterschied zwischen einer 'Login'- und einer' Interactive'-Bash-Shell (von der Schwestersite: serverfault.com )
- 2.1: Shelltypen: Interaktive Shells und Anmeldeshells (vom Benutzerhandbuch zur Z-Shell )
Meine Frage ist, wie kann ich mit einem Befehl / einer Bedingung testen, ob ich mich in einer interaktiven, einer Anmelde- oder einer Batch-Shell befinde?
Ich suche nach einem Befehl oder einer Bedingung (die true
oder zurückgibt false
) und die ich auch auf eine if-Anweisung setzen könnte. Zum Beispiel:
if [[ condition ]]
echo "This is a login shell"
fi
Antworten:
Ich gehe von einer
bash
Shell oder ähnlichem aus, da in den Tags keine Shell aufgeführt ist.So überprüfen Sie, ob Sie sich in einer interaktiven Shell befinden:
So überprüfen Sie, ob Sie sich in einer Anmeldeshell befinden:
Mit "Batch" meine ich "nicht interaktiv", daher sollte die Überprüfung für eine interaktive Shell ausreichen.
quelle
zsh
Benutzer kann nach einer Anmeldeshellif [[ -o login ]] ...
$-
ist und in der aktuellen Shell erweitert wird. Wenn Sie den vollständigen Ausdruck in einfache Anführungszeichen setzen, erhalten Sie das richtige Ergebnis:bash -c '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"'
In jeder Bourne-artigen Shell gibt die
i
Option an, ob die Shell interaktiv ist:Es gibt keine tragbare und absolut zuverlässige Möglichkeit, eine Login-Shell zu testen. KSH und zsh hinzufügen
l
zu$-
. Bash legt dielogin_shell
Option fest, mit der Sie abfragen könnenshopt -q login_shell
. Testen Sie portabel, ob$0
Starts mit a-
: Shells normalerweise wissen, dass es sich um Login-Shells handelt, da der Aufrufer dem-
Argument Null ein Präfix hinzugefügt hat (normalerweise den Namen oder den Pfad der ausführbaren Datei). Dies kann keine Shell-spezifischen Methoden zum Aufrufen einer Login-Shell erkennen (zash -l
. B. ).quelle
$0
immer mit einer-
Sache angefangen würde, egal wie sie angefangen wurde. Es gibt jedoch mindestens eine Ausnahme: Dies gilt nicht immer für Bash, auch wenn es sich um eine Anmeldeshell handeln soll. Versuchen Sie es in Ihrer Box: aufrufenbash --login
, dann$0
liest nochbash
.Fischmuschel
Hier ist die Antwort für den
fish
Fall, dass andere Benutzer auf diese Seite stoßen.Fischdokumentation: Initialisierung
quelle
csh / tcsh
Für
csh
undtcsh
ich habe folgendes in meiner.cshrc
Akte:Speziell für
tcsh
wird die Variableloginsh
für eine Login-Shell gesetzt:(
tcsh
Hat auch eine Variable,shlvl
die auf die Anzahl der verschachtelten Shells festgelegt ist, wobei die Anmeldeshell den Wert 1 hat.)quelle
PS1
funktioniert nicht zum Testen einer interaktiven Shell. Es ist fast immer in ein interaktives gesetzt, aber Sie können es deaktivieren. Es befindet sich sehr oft in einer nicht interaktiven Shell, da viele Systeme mitexport PS
in ausgeliefert werden/etc/profile
.Eine andere Möglichkeit besteht darin, das Ergebnis von zu überprüfen
tty
quelle
[ -t 0 ]
zum Testen, ob STDIN eine tty ist. Sie können je nach Bedarf auch 1 (STDOUT) oder 2 (STDERR) verwenden.disown
am Leben ließ,tty
funktionierte sie am besten, um zu wissen, dass sie nicht mehr interaktiv ist, obwohl sie$-
sich nicht geändert hat. Ich bin immer noch verwirrt, was der beste Ansatz ist.[ -t 0 ]
. PS In meinem vorherigen Kommentar schrieb ich, dass „es eine starke Korrelation gibt“ - ich vergaß „abgesehen von dem extrem häufigen Fall eines Skripts, das mit#!/bin/sh
oder ähnlichem begonnen wurde“, das nicht interaktiv ist, aber mit einem Terminal verbunden werden kann.UNIX / Linux verfügt über einen Befehl, mit dem Sie überprüfen können, ob Sie sich an einem Terminal befinden.
quelle
dash
auch.Sie können überprüfen, ob stdin ein Terminal ist:
quelle
Um zu überprüfen, ob ein Skript in einer interaktiven oder nicht interaktiven Shell ausgeführt wird, überprüfe ich meine Skripte auf das Vorhandensein einer in der
$PS1
Variablen gespeicherten Eingabeaufforderung :Dies habe ich hier gelernt: https://www.tldp.org/LDP/abs/html/intandnonint.html
quelle
i
ist nicht die richtige Option zu suchen.-i
besteht darin, eine ansonsten nicht interaktive Shell zu zwingen, interaktiv zu werden. Die richtige automatisch aktivierte Option ist-s
, aber Bash behandelt dies leider nicht richtig.Sie müssen prüfen, ob
$-
enthälts
(dies wird für die automatische Aktivierung gewährt) oder ob es enthälti
(dies wird nicht für die automatische Aktivierung gewährt, sondern ist offiziell nur mit der-i
Befehlszeilenoption der Shell gekoppelt ).quelle
s
Wäre, wenn die Shell Befehle von stdin liest, nicht, ob es interaktiv ist. Eine interaktive Shell liest nicht unbedingt Befehle aus stdin (tryzsh -i < /dev/null
, obwohl zsh hier die Ausnahme zu sein scheint). Und eine Shell liest möglicherweise Befehle von stdin und ist nicht interaktiv (wiesh < file
oderecho 'echo "$1"' | sh -s foo bar
).[[...]]
die ksh / bash / zsh impliziert. Sie haben einen Punkt als bekam Geschichte zur Kenntnis , dass für die Überprüfungi
in$-
wird in dem Bourne - Shell nicht. Aber danns
funktioniert das Prüfen auf auch dort nicht zuverlässig. Sie möchten auch nach[ -t 0 ]
oderi
suchen. Selbst dann würde man sich in Eckfällen wieecho 'exec < /dev/tty; that-check' | sh'