如果我使用 bashrc 打开 Fish(如果存在),则会出现 scp 问题

如果我使用 bashrc 打开 Fish(如果存在),则会出现 scp 问题

情况:需要登录多个远程服务器,其中一些服务器具有 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 将由sshdSSH 守护进程启动的 shell 会话视为特殊情况。

细节:为什么 bashrc 检查当前 shell 是否是交互式的?

在文件的更下方,您可以检查 shell 是否fish可用并启动:

if command -v fish 2>/dev/null; then
   exec fish
fi

请注意,fish在某些系统上这可能是“Go Fish”游戏:-)

关于使用command -v为什么不用“哪个”呢?那该用什么呢?

相关内容