我对它做了一些修改,/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 设备时将发出错误消息。stty
检查标准输入(fd 0);我不知道who
检查什么文件描述符。为了避免收到这些错误消息,通常的解决方法是使用-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 已打开并且与终端关联,则为 True。如果 file_descriptor 不是有效的文件描述符编号,或者文件描述符编号 file_descriptor 未打开,或者它已打开但未与终端关联,则为 False。
答案2
您的脚本第一次使用who
not whoami
。改变它,你应该得到你期望的结果。