
Ситуация:Необходимо войти на несколько удаленных серверов, некоторые из которых имеют fish shell
Требование:Оболочка по умолчанию — bash. Если я захожу на сервер и там присутствует fish, переключаюсь на fish shell, в противном случае остаюсь на bash.
Попробовал .bashrc:
# .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
Однако scp, похоже, не работает. Когда я пытаюсь scp-файл, подробный вывод показывает, что он застрял здесь.
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
Сначала я думал, echo
что эта команда не работает, но без нее тоже не работает.
решение1
Чтобы выйти из bashrc
файла, когда сеанс оболочки, который его использует, не является интерактивным, вы можете выполнить следующие действия в верхней части файла (или в удобном месте):
case "$-" in
*i*) ;;
*) return ;;
esac
Значение в $-
— это строка букв, обозначающая текущие установленные параметры оболочки. Если i
символ присутствует в строке, то оболочка интерактивна.
Это может быть необходимо, поскольку, как отметил в комментариях terdon, Bash рассматривает сеансы оболочки, запущенные sshd
демоном SSH, как особый случай.
Подробности:Почему bashrc проверяет, является ли текущая оболочка интерактивной?
Далее в файле вы можете проверить, fish
доступна ли оболочка, и запустить ее:
if command -v fish 2>/dev/null; then
exec fish
fi
Имейте в виду, что fish
на некоторых системах может быть игра «Go Fish» :-)
Об использовании command -v
:Почему бы не использовать "which"? Что тогда использовать?