web-dev-qa-db-ja.com

シェルがインタラクティブモードで実行されている場合、bashをチェックインするにはどうすればよいですか?

~/.bashrcで)インタラクティブモードで実行しているかどうか、またはsshでコマンドを実行しているかどうかをどのように確認できますか。後者の場合、.bashrcにANSIエスケープシーケンスが出力されないようにしたいと思います。

51
Alex B

man bashによると:

PS1が設定され、bashがインタラクティブな場合は$-にiが含まれ、シェルスクリプトまたはスタートアップファイルでこの状態をテストできます。

だからあなたは使うことができます:

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

また:

ログインシェルではないインタラクティブシェルが起動すると、bashは/etc/bash.bashrcおよび〜/ .bashrcからコマンドを読み取り、これらのファイルが存在する場合はそれらを実行します。

したがって、~/.bashrcはインタラクティブシェル用にのみ提供されます。時々、人々はそれを~/.bash_profileまたは~/.profileから調達しますが、これは期待される動作を妨害するため正しくありません。共通のコードのメンテナンスを簡略化したい場合は、別のファイルを使用して共通のコードを含め、両方のrcファイルから独立してソースを提供する必要があります。

ログインrcファイル(~/.bash_profile~/.profileなど)からstdoutへの出力がない場合は、たとえばrsyncの正常な動作を妨げる可能性があるため、最適です。

いずれの場合も、不正な構成が存在する可能性があるため、対話性をテストすることをお勧めします。

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
14
user4514

使用する:

if tty -s; then echo interactive; fi
12
sorin

私は通常、プログラムttyの出力を確認します。

Ttyを使用している場合は、どのttyを使用しているかがわかります。インタラクティブモードでない場合は、通常、「ttyではない」のようなメッセージが表示されます。

6
chris

これがRed Hatの方法です...最速の方法だと思います...

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

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

Sftpを使用してユーザーに接続し、ジョブを実行したことを確認します。非インタラクティブセッションに出力がある場合は失敗します

2
Ray Foss