>

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 를 사용하여 파일을 읽기 전에 파일이 존재하는지 확인할 수 있습니다.  일명 [  명령 :

    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 를 사용하여  옵션이 반환됩니다

    와이즈 비즈

    와이즈 비즈  쉘 사용자가 실제로파일을 읽을권한이 있는지 확인하기 때문에 test가 더 적합 할 수 있습니다.

    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.

  • 이전 sed - 두 파일을 비교하여 동일한 목록을 얻습니다
  • 다음 ubuntu - apt-get으로 어떤 파일 (스크립트 및 구성)을 설치했는지 어떻게 알 수 있습니까?