Ksh
有沒有辦法防止非終端連接的程序在我的 .envfile 中執行“誰”?
我對 進行了一些修改,
/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。