쉘 표준 오류를 /dev/null로

쉘 표준 오류를 /dev/null로

나는 PID 파일을 가지고 있고 PID 번호를 얻고 싶습니다. 그래서 그것이 제가 하고 있는 일입니다.

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

가끔 이 파일이 존재하지 않고 파일 오류가 발생하는 경우가 있는데, 파일이 존재하지 않으면 오류가 발생하지 않도록 지정하고 싶습니다.

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

사용하려고 하는데 2&> /dev/null작동하지 않습니다. 제가 뭘 잘못하고 있는 걸까요?

답변1

먼저 $()문제가 있는 오래된 `` 대신 명령 대체를 사용하기 시작합니다.

귀하의 경우 catSTDERR 스트림(파일 설명자 2)에 파일이 없으면 오류 메시지가 표시됩니다.

susbstution 명령을 사용하면 STDOUT에 있는 내용을 변수에 저장할 수 있습니다 PID. 따라서 파일이 없을 때 오류 메시지를 제거하려면 파일 설명자 2를 다음으로 리디렉션하세요 /dev/null.

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

zsh파생 상품 에서는 ksh단축키를 사용할 수 있습니다 cat.

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

에서는 bash사용할 수 a=$(<file)있지만 a=$(<file 2>/dev/null).

답변2

일반적으로 testaka 명령을 사용하여 [파일을 읽기 전에 파일이 존재하는지 확인할 수 있습니다.

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

또는 한 줄을 선호하는 경우:

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

POSIX 셸에서 이 -f옵션을 사용하면 다음이 반환됩니다.

경로 이름이 일반 파일의 기존 디렉터리 항목으로 확인되면 참입니다. 경로 이름을 확인할 수 없거나 경로 이름이 비정규 파일에 대한 기존 디렉터리 항목으로 확인되면 False를 반환합니다.

-r테스트는 쉘 사용자에게 실제로 다음 권한이 있는지도 확인하므로 더 적절할 수 있습니다.읽다문서.

관련 정보