シェルが対話モードで実行されているかどうかを bash で確認するにはどうすればよいですか?

シェルが対話モードで実行されているかどうかを bash で確認するにはどうすればよいですか?

対話モードで実行しているのか、それとも ssh 経由でコマンドを実行しているのかを( ) で確認するにはどうすればよいでしょうか。後者の場合は~/.bashrc、 での ANSI エスケープ シーケンスの出力を避けたいです。.bashrc

答え1

によるとman bash

bash が対話型の場合、PS1 が設定され、$- に i が含まれるため、シェル スクリプトまたは起動ファイルでこの状態をテストできます。

したがって、次のものを使用できます。

if [[ $- == *i* ]]
then
    do_interactive_stuff
fi

また:

ログイン シェルではない対話型シェルが起動されると、bash は /etc/bash.bashrc および ~/.bashrc ファイルが存在する場合、そこからコマンドを読み取って実行します。

したがって、~/.bashrc対話型シェルにのみソースされます。 または からソースされる場合もあります~/.bash_profileが、~/.profileこれは期待される動作を妨げるため、正しくありません。共通するコードのメンテナンスを簡素化したい場合は、共通コードを格納する別のファイルを使用し、両方の rc ファイルから独立してソースする必要があります。

またはrcなどのログイン ファイルからの stdout への出力がないのが最善です。これは、たとえばの適切な動作を妨げる可能性があるためです。~/.bash_profile~/.profilersync

いずれにしても、誤った構成が存在する可能性があるため、対話性をテストすることをお勧めします。

答え2

ツールtestはこれをチェックできます (man ページから):

 -t FD          True if FD is opened on a terminal.

たとえば、次のように使用できます。

 if [ -t 0 ] ; then
    echo stdin is a terminal
   .....
 fi

または

if [ -t 1 ] ; then
    echo stdout is a terminal
 fi

答え3

使用:

if tty -s; then echo interactive; fi

答え4

これが Red Hat のやり方です... おそらくこれが最速の方法でしょう...

if [ "${-#*i}" == "$-" ]; then

これは、bash パラメータを取得し、可能な限り短く部分文字列を削除し、先頭と i の間のすべてを一致させることを意味します。次に、元の bash パラメータと同じかどうかを確認します。

sftpを使用してユーザーに接続してジョブを実行したことを確認してください。非対話型セッションで出力があった場合は失敗します。

関連情報