情况:需要登录多个远程服务器,其中一些服务器具有 Fish shell
要求:默认 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
在获取文件的 shell 会话不具有交互性时退出文件,您可以在文件的顶部(或方便的位置)执行以下操作:
case "$-" in
*i*) ;;
*) return ;;
esac
中的值$-
是一串字母,表示当前设置的 shell 选项。如果i
字符串中存在该字符,则 shell 是交互式的。
这可能是必要的,因为正如 terdon 在评论中指出的那样,Bash 将由sshd
SSH 守护进程启动的 shell 会话视为特殊情况。
细节:为什么 bashrc 检查当前 shell 是否是交互式的?
在文件的更下方,您可以检查 shell 是否fish
可用并启动:
if command -v fish 2>/dev/null; then
exec fish
fi
请注意,fish
在某些系统上这可能是“Go Fish”游戏:-)
关于使用command -v
:为什么不用“哪个”呢?那该用什么呢?