
Situation:Sie müssen sich bei mehreren Remote-Servern anmelden, von denen einige eine Fish-Shell haben
Erfordernis:Die Standard-Shell ist Bash. Wenn ich mich bei einem Server anmelde und Fish vorhanden ist, wechsle ich zur Fish-Shell, andernfalls bleibe ich bei Bash.
Habe .bashrc ausprobiert:
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Source global definitions
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
# Update Path
export PATH=/sbin:/usr/sbin:/usr/local/sbin:$PATH:$HOME/.bin
# Open fish shell if present, otherwise stick to bash
if hash fish 2>/dev/null; then
# echo "Fish detected, shifting shell"
fish "$@"; exit
fi
Allerdings scheint scp nicht zu funktionieren. Wenn ich versuche, eine Datei per scp zu scannen, zeigt die ausführliche Ausgabe an, dass sie hier hängen bleibt.
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: pledge: network
debug1: client_input_global_request: rtype [email protected] want_reply 0
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
debug1: Sending env LC_ADDRESS = en_US.UTF-8
debug1: Sending env LC_IDENTIFICATION = en_US.UTF-8
debug1: Sending env LC_MEASUREMENT = en_US.UTF-8
debug1: Sending env LC_MONETARY = en_US.UTF-8
debug1: Sending env LC_NAME = en_US.UTF-8
debug1: Sending env LC_NUMERIC = en_US.UTF-8
debug1: Sending env LC_PAPER = en_US.UTF-8
debug1: Sending env LC_TELEPHONE = en_US.UTF-8
debug1: Sending env LC_TIME = en_US.UTF-8
debug1: Sending command: scp -v -f test_file
Ich dachte zunächst, dass der echo
Befehl die Ursache dafür sei, dass es nicht funktioniert, aber ohne ihn funktioniert es auch nicht.
Antwort1
Um die bashrc
Datei zu schließen, wenn die Shell-Sitzung, aus der sie stammt, nicht interaktiv ist, können Sie oben (oder an einer geeigneten Stelle) der Datei Folgendes tun:
case "$-" in
*i*) ;;
*) return ;;
esac
Der Wert in $-
ist eine Buchstabenfolge, die die aktuell eingestellten Shell-Optionen bezeichnet. Wenn das i
Zeichen in der Zeichenfolge vorhanden ist, ist die Shell interaktiv.
Dies kann erforderlich sein, da Bash, wie Terdon in Kommentaren anmerkte, Shell-Sitzungen, die vom sshd
SSH-Daemon gestartet werden, als Sonderfall behandelt.
Einzelheiten:Warum prüft bashrc, ob die aktuelle Shell interaktiv ist?
Weiter unten in der Datei können Sie prüfen, ob die fish
Shell vorhanden ist und diese starten:
if command -v fish 2>/dev/null; then
exec fish
fi
Beachten Sie, dass fish
es sich auf manchen Systemen um das Spiel „Go Fish“ handeln kann :-)
Über die Verwendung von command -v
:Warum nicht „welches“ verwenden? Was soll man dann verwenden?