シェルが対話モードで実行されている場合、どのようにbashをチェックできますか?


46

~/.bashrc対話モードで実行しているか、たとえばsshでコマンドを実行しているかを(で)知る方法はありますか。.bashrc後者の場合、ANSIエスケープシーケンスの出力を避けたい。


エスケープシーケンスを出力するかどうかの選択は、シェルの対話性ではなく、$ TERM値に基づいて行うことをお勧めします。変数は、エスケープシーケンスを解釈する部分であるクライアント端末の機能を識別します。
yrk

回答:


53

によると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の適切な操作を妨げる可能性があるため、これが最適ですrsync

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


7
$-にはi が含まれる場合がありますが、必ずしも等しいとは限りません。私が使用する[[ $- =~ i ]] && echo interactive
アレックスハワンスキー

1
@AlexHowansky:平等テストのアスタリスクは、それを含むためのテストにしますi
デニスウィリアムソン

ああ、それらにも気付かなかったのです。私のモニターでは二重引用符のように見えます。フォントサイズを大きくするときが来るかもしれません。<古い>
アレックスハワンスキー

時々、人々はそれをソースにする~/.bash_profileか、~/.profileそれが予想される動作を妨害するので間違っています。あなたは調達をどう思いますか~/.bashrcから~/.bash_login?ログインシェルはインタラクティブである必要はないので、私もそれが間違っていると思います。
ピョートルドブロゴスト14年

1
@PiotrDobrogost:これはシェルスタートアップファイルの優れた議論です。
デニスウィリアムソン14年

12

つかいます:

if tty -s; then echo interactive; fi

動作していないようです
スティーブンショー

これも私にはうまくいかないようです、これは正しい答えだと思います:stackoverflow.com/a/49064632/1223975
Alexander Mills

これにより、標準入力にTTYが存在するかどうかが確認されます。関係はありますが、シェルの「-i」フラグで示されるシェルのインタラクティブモードとは異なります。
yrk

動作しません。なぜ人々は賛成したのか?
Setop

11

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

素敵で、シェル間で移植できるようです。テストbash <<< 'test -t 0 && echo Y || echo X'書き込みYbash -c 'test -t 0 && echo Y || echo X'書き込みX
-kyb

1
これは、標準入力がTTYであることも検証します。関係はありますが、シェルのインタラクティブモードとは異なります。これは、シェルの「-i」フラグによって要求され、示されます。
yrk

6

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

ttyを使用している場合、どのttyを使用しているかがわかります。対話モードでない場合、通常、「not a tty」などの情報が表示されます。


3
tty -sは、端末を使用している場合は0を返し、それ以外の場合は出力を行わずに1を返します。if tty -s;として使用できます。その後、_interactive; Fiの」
BillThor

ありがとう!それはされています長い ...私はこの種のものを行うために必要てきてからの時間と私は詳細の一部を忘れてしまったと思います
クリス・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.