対話モードで実行しているのか、それとも 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
~/.profile
rsync
いずれにしても、誤った構成が存在する可能性があるため、対話性をテストすることをお勧めします。
答え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を使用してユーザーに接続してジョブを実行したことを確認してください。非対話型セッションで出力があった場合は失敗します。