非ターミナル接続プロセスが私の.envファイルで "who"を実行するのを防ぐ方法はありますか?

非ターミナル接続プロセスが私の.envファイルで

/home/user/.envfileプロンプトにPS1日付/時刻などが表示されるように少し修正しましたpwd

に変更:

# `who am i` is used to obtain the name of the original user
case `who am i | awk '{print $1}'` in
    'someuser')
        #set the prompt to include the date and time
        set -o allexport
        unset _Y _M _D _h _m _s
        eval $(date "+_Y=%Y;_M=%m;_D=%d;_h=%H;_m=%M;_s=%S")
        ((SECONDS = 3600*${_h#0}+60*${_m#0}+${_s#0}))
        typeset -Z2 _h _m _s
        _tsub="(_m=(SECONDS/60%60)) == (_h=(SECONDS/3600%24)) + (_s=(SECONDS%60))"
        _timehm='${_x[_tsub]}$_h:${_m}'
        _timehms='${_x[_tsub]}$_h:$_m:${_s}'
        _timedhms=$_Y'/'$_M'/'$_D" "'${_x[_tsub]}$_h:$_m:${_s}'
        _hn=`hostname`
        typeset -u _hn
        # `whoami` is used here to display the name of the 'su' user
        _un=`whoami | awk '{print $1}'`
        typeset -u _un
        export PS1="$_timedhms
"'['$_un']'$_hn':${PWD#$HOME/} $ '
        set +o allexport
    ;;
    *)
    ;;
esac

プロンプトは次のようになります。

2014/08/07 11:08:24
[su'd username]hostname:/home/username $

ご覧のとおり、whoamiプロンプトで現在のユーザーの名前を表示するために使用されます。

このアカウントで実行されているプロセスの一部について不満があります。

who: 0551-012 The process is not attached to a terminal.
        Do not run who am i as a background process.
Usage: who [-AabdHilmpqrsTtuwX?] [am {i,I}] [utmp_like_file]

この修正が他のプロセスに影響を与えるのを防ぐ方法はありますか?プロセスが端末に接続されていない場合を検出することで可能ですか?

ベストアンサー1

スティそして以前のバージョン私は誰ですかtty デバイスに接続していない場合は、エラーメッセージが出されます。標準入力(fd 0)を確認してください。どのファイル記述子を確認するのかsttyわかりません。これらのエラーメッセージを受け取らないようにするには、一般的な回避策は次のオプションをwho使用することです。-tテスト(通常[)シェルがttyに接続されていることを確認してください。

if [ -t 0 ]
then
    ID=`who am i | awk '{print $1}'`
else
    ID="unknown"
fi

あなたの場合、ifPS1はttyで作業するときにのみ意味があるため、そのステートメントにPS1変数を設定するための完全なロジックを含めることができます。

test上記のリンクの説明に関連する部分は次のとおりです。

-t ファイル記述子

ファイル記述子 file_descriptor が開いていて端末に関連付けられている場合は真です。 file_descriptor が有効なファイル記述子番号でない場合、またはファイル記述子番号 file_descriptor が開かれていないか、開いているが端末に関連付けられていない場合は False です。

おすすめ記事