.bashrcファイルで「対話型で実行しない限り何もしないでください」とはどういう意味ですか?

.bashrcファイルで「対話型で実行しない限り何もしないでください」とはどういう意味ですか?

私の.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_profilessh remote echo 1zshを使用してサーバーに接続すると、非対話式で非ログインで実行されます。

関連情報