비터미널 연결 프로세스가 내 .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 장치에 연결되지 않은 경우 오류 메시지가 발행됩니다. 표준 입력(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입니다.

답변2

귀하의 스크립트는 처음으로 사용하지 who않습니다 whoami. 변경하면 원하는 결과를 얻을 수 있습니다.

관련 정보