Проблемы с scp, если я использую bashrc для открытия fish, если он есть

Проблемы с scp, если я использую bashrc для открытия fish, если он есть

Ситуация:Необходимо войти на несколько удаленных серверов, некоторые из которых имеют 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"? Что тогда использовать?

Связанный контент