Ksh

有沒有辦法防止非終端連接的程序在我的 .envfile 中執行“誰”?

  • August 7, 2014

我對 進行了一些修改,/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]

有什麼方法可以防止該修改影響其他程序?可能通過檢測程序何時未連接到終端?

stty和是誰的舊版本在未連接到 tty 設備時會發出錯誤消息。stty檢查標準輸入(fd 0);我不知道檢查什麼文件描述符who。為了避免收到這些錯誤消息,通常的解決方法是使用test-t選項(通常稱為)來檢查 shell 是否連接到 tty。[

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

在您的情況下,您可以在該語句中圍繞設置 PS1 變數的整個邏輯if,因為 PS1 只有在處理 tty 時才有意義。

以下是上述test連結中解釋的相關部分。

-t 文件描述符

如果文件描述符編號 file_descriptor 已打開並與終端關聯,則為真。如果 file_descriptor 不是有效的文件描述符編號,或者文件描述符編號 file_descriptor 未打開,或者它已打開但未與終端關聯,則為 False。

引用自:https://unix.stackexchange.com/questions/148840