有没有办法阻止非终端附加进程在我的 .env 文件中执行“who”?

有没有办法阻止非终端附加进程在我的 .env 文件中执行“who”?

我对它做了一些修改,/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

您的脚本第一次使用whonot whoami。改变它,你应该得到你期望的结果。

相关内容