(~/.bashrc
で)インタラクティブモードで実行しているかどうか、またはsshでコマンドを実行しているかどうかをどのように確認できますか。後者の場合、.bashrc
にANSIエスケープシーケンスが出力されないようにしたいと思います。
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
使用する:
if tty -s; then echo interactive; fi
私は通常、プログラムttyの出力を確認します。
Ttyを使用している場合は、どのttyを使用しているかがわかります。インタラクティブモードでない場合は、通常、「ttyではない」のようなメッセージが表示されます。
これがRed Hatの方法です...最速の方法だと思います...
if [ "$-#*i" == "$-" ]; then
これは、bashパラメータを取得し、部分文字列を削除し、可能な限り最短で、最初とiの間のすべてに一致することを意味します。次に、元のbashパラメータと同じかどうかを確認します。
Sftpを使用してユーザーに接続し、ジョブを実行したことを確認します。非インタラクティブセッションに出力がある場合は失敗します