.png)
状況:複数のリモートサーバーにログインする必要があり、そのうちのいくつかにはフィッシュシェルがあります
要件:デフォルトのシェルは bash です。サーバーにログインして fish が存在する場合は fish シェルに切り替え、そうでない場合は 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」を使わないのはなぜですか? では、何を使うべきでしょうか?