shell stderr para / dev / null

1

Eu tenho o arquivo PID e quero obter o número PID, então é isso que estou fazendo.

[root@linux ~]# PID='cat /usr/local/foo/var/run/foo.pid'
[root@linux ~]# echo $PID
3414

às vezes este arquivo não existe e este erro de arquivo de lançamento, eu quero especificar para não lançar um erro, se o arquivo não existe.

[root@linux ~]# PID='cat /usr/local/foo/var/run/foo.pid'
cat: /usr/local/foo/var/run/foo.pid: No such file or directory

Estou tentando usar 2&> /dev/null , mas não está funcionando, o que estou fazendo de errado?

    
por Satish 04.03.2016 / 18:09

2 respostas

4

Primeiro de tudo, comece a usar $() para substituição de comando em vez de mais antigo, problemático ''.

No caso, cat está mostrando a mensagem de erro quando o arquivo não existe no fluxo STDERR (descritor de arquivo 2).

Com o comando susbstution, você está salvando apenas o que está no STDOUT para a variável PID . Então, para se livrar da mensagem de erro quando o arquivo não existe, redirecione o descritor de arquivo 2 para /dev/null :

PID=$(cat /usr/local/foo/var/run/foo.pid 2>/dev/null)

Em zsh e ksh derivadas, você pode usar o atalho para cat :

PID=$(< /usr/local/foo/var/run/foo.pid 2>/dev/null)

Em bash , você pode usar a=$(<file) , mas não a=$(<file 2>/dev/null) .

    
por 04.03.2016 / 18:19
1

Em geral, você pode verificar se existe um arquivo antes de tentar lê-lo usando o comando test aka [ :

if [ -f /usr/local/foo/var/run/foo.pid ]; then
    PID=$(cat /usr/local/foo/var/run/foo.pid)
fi

ou se preferir os de uma linha:

[ -f /usr/local/foo/var/run/foo.pid ] && PID=$(cat /usr/local/foo/var/run/foo.pid)

Em um shell POSIX, o uso da opção -f retornará

True if pathname resolves to an existing directory entry for a regular file. False if pathname cannot be resolved, or if pathname resolves to an existing directory entry for a file that is not a regular file.

O -r test pode ser mais apropriado, pois também verifica se o usuário do shell realmente tem permissão para ler o arquivo.

    
por 04.03.2016 / 20:10