
私の.bashrcの上部には次のコマンドが含まれています。
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
私の.bashrcテンプレートはUbuntuで作成されたので、私の.bash.rcに追加したことはありません。
私が知っている限り、このコマンドはリモートシェル(rsh)またはセキュリティシェル(ssh)から.bashrcファイルをインポートするのを防ぐためです。 .bashrcに次の内容がある場合、alias rm='rename'
上記のエイリアスはリモートシェルでは機能しません。ただし、対応するコマンドがない場合、エイリアスは機能します。リモートシェルに「名前変更」がインストールされていないと、rm
実行時にエラーが発生します。したがって、最終的な目標は、.bashrcファイルのソースをブロックして、予期しない動作を防ぐことです。
だからこれが私が混乱しているところです。このコマンドを完全に削除しましたが、リモートシェルには違いはありません。テストする前に.bashrcをインポートしてシステムを再起動したことがありましたが、ssh(この場合は2つのサーバー)で予期しない動作がまったく見えません。
私は.bashrcにecho関数を生成し、サーバーから呼び出すなどの簡単なテストを試しました。私が得るすべてはコマンドが見つかりません:foo。
私がすることができる唯一の結論は、私のサーバーの1つには独自の.bashrcがあり、他のサーバーには.zshrcがあるため、私のローカルの.bashrcよりも優先されるため、ソースが提供されないことです。それでは、なぜ上記のコマンドが必要ですか?上記のコマンドは廃止され、2022年にはもう有効ではありませんか?それとも機能しますが、.bashrc、.zshrc、または同様のファイルを持たないサーバーでsshを使用しているシステム管理者にのみ適用されます。
要約:すでに独自の.bashrcファイルまたは.zshrcファイルを持っている私のサーバーにsshを介してのみ接続している場合は、それを.bashrcファイルに追加する必要がありますか?
答え1
一つインタラクティブシェルはプロンプトを表示してコマンドを入力できる場所です。
非対話型シェルはスクリプトを開始する場所です。
読む6.2 Bash 起動ファイルシェルの起動時にどのファイルが検索されるかについては、マニュアルを参照してください。
一般的に何かを入れます。
~/.profile
または、~/.bash_profile
ログイン時に発生したい(環境変数の設定、SSHエージェントの起動、対話型シェル、および実行中の他のプログラムに影響を与えるタスク)。~/.bashrc
対話型使用のためにのみ設定したいこと(エイリアス、機能、コマンド入力を簡単にすること)
これが違いです
$ echo "$-"
himBCHs
そしてスクリプトを実行してください
$ cat > myscript.sh
#!/usr/bin/env bash
echo "$-"
$ bash ./myscript.sh
hB
~/.bashrc
スクリプトに必要なものがあればできますが、source ~/.bashrc
質問のケースの説明が失敗する可能性があります。より良いオプションは、bashに対話型シェルのように動作するように指示することです。
$ bash -i ./myscript.sh
himBCH
答え2
男バッシュが言う
An interactive shell is one started without non-option
arguments (unless -s is specified) and without the -c option
whose standard input and error are both connected to
terminals (as determined by isatty(3)), or one started with
the -i option. PS1 is set and $- includes i if bash is
interactive, allowing a shell script or a startup file to
test this state.
表示したばかりのコードは、シェルが対話型であることを確認するテストです。この場合、残りは実行され、.bashrc
そうでなければinit-shellファイルの残りは無視されます。
答え3
TLDR:すでに独自の.bashrcファイルまたは.zshrcファイルを持っている私のサーバーにSSHを介してのみ接続している場合は、それを.bashrcファイルに追加する必要がありますか?
はい、いいえ。
はい。ファイル転送コマンドがscp
正しく機能していることを確認するには、この情報が必要です。このエラーを参照してください。https://bugzilla.redhat.com/show_bug.cgi?id=20527
echo
.bashrcに何もないとscp
失敗します。
いいえ。ファイル転送が正しく機能していることを確認し、非対話型シェルを介してコマンドを実行しない場合は、.bashrcにそのファイルは必要ありません。
答え4
これは私が見つけた最も鮮明な写真です。
(申し訳ありませんが、写真ソースを紛失しました。お探しの場合はお知らせください)
これを使用してssh remote
リモートサーバーに接続すると、ログイン対話型シェルになります。
ssh remote echo 1
以下を使用してリモートサーバーに接続する場合echo 1
exec /bin/zsh
内部実行などのトリックを使用~/.bash_profile
してをssh remote
使用してそのサーバーに接続すると、zshは非ログインで対話的に実行されます。
exec /bin/zsh
内部実行などのトリックを使用し~/.bash_profile
てssh remote echo 1
zshを使用してサーバーに接続すると、非対話式で非ログインで実行されます。