Existe uma maneira de impedir que um processo não-anexado ao terminal execute 'who' dentro do meu .envfile?

3

Eu fiz algumas modificações no /home/user/.envfile , então o prompt PS1 mostraria data / hora, assim como o pwd etc.

A modificação é:

# '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

O prompt deve se parecer com:

2014/08/07 11:08:24
[su'd username]hostname:/home/username $

Como você pode ver, isso faz uso de whoami para exibir o nome do usuário atual no prompt.

Certos processos que passamos por esta conta estão reclamando:

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]

Existe alguma maneira de impedir que essa modificação afete esse outro processo? Possivelmente detectando quando o processo não está conectado a um terminal?

    
por Max Vernon 07.08.2014 / 00:54

2 respostas

4

stty e versões mais antigas de quem sou eu emitirá mensagens de erro quando elas não estiverem conectadas a um dispositivo tty. stty verifica stdin (fd 0); Não sei qual descritor de arquivo who verifica. Para evitar essas mensagens de erro, a solução usual é usar a opção -t do teste (mais comumente conhecido como [ ) para verificar se o shell está conectado a um tty.

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

No seu caso, você pode cercar toda a lógica que configura a variável PS1 na instrução if , já que o PS1 só faz sentido quando se está trabalhando em um tty.

A seguir, a seção relevante da explicação de test no link acima.

-t file_descriptor

True if file descriptor number file_descriptor is open and is associated with a terminal. False if file_descriptor is not a valid file descriptor number, or if file descriptor number file_descriptor is not open, or if it is open but is not associated with a terminal.

    
por 07.08.2014 / 17:51
3

Seu script, na primeira vez, está usando who não whoami . Mude-o e você deverá obter o resultado esperado.

    
por 07.08.2014 / 01:33

Tags