状態:複数のリモートサーバーにログインする必要があり、その一部にはフィッシュシェルがあります
必要:デフォルトのシェルは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」を使わないのはなぜですか?それでは何を使うべきですか?