나는 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
먼저 $()
문제가 있는 오래된 `` 대신 명령 대체를 사용하기 시작합니다.
귀하의 경우 cat
STDERR 스트림(파일 설명자 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
일반적으로 test
aka 명령을 사용하여 [
파일을 읽기 전에 파일이 존재하는지 확인할 수 있습니다.
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
테스트는 쉘 사용자에게 실제로 다음 권한이 있는지도 확인하므로 더 적절할 수 있습니다.읽다문서.