Bash 조건 지시문의 따옴표 이해

Bash 조건 지시문의 따옴표 이해

내 친구는 Bash 스크립트를 가지고 놀고 있었고 나에게 그 스크립트를 살펴보라고 했습니다. (그는 다른 친구에게 그 스크립트를 대신 해달라고 요청했습니다.) 명령 중 하나는

if [ "`pidof transmmission-gtk`"=0 ];

`특히 pidof 자체가 큰따옴표로 묶인 경우 앞의 (백틱)의 요점은 정확히 무엇입니까 ?

참고로 분산 해상도 패키지용입니다. 저는 bash를 그렇게 많이 사용하지 않아서 물어봅니다.

답변1

백틱은 다음을 의미합니다.명령 대체: 확장된 결과 `pidof transmission-gtk`는 실행 중인 명령의 출력입니다 pidof transmission-gtk. `pidof transmission-gtk`이를 작성하는 또 다른 방법 $(pidof transmission-gtk)은 이 대안이며 권장됩니다(백틱 자체 내부의 명령에 따옴표가 포함되어 있으면 단점이 없으며 문제를 방지합니다).

큰따옴표를 사용하면 명령 대체 결과가 별도의 단어로 분할되어 와일드카드 패턴으로 해석되는 것을 방지할 수 있습니다. 방금 쉘 스크립트를 시작하는 경우에는 이에 대해 걱정하지 마십시오. 명령 대체 주위에 항상 큰따옴표를 넣는 것을 기억하십시오. 변수 대체의 경우에도 마찬가지입니다. 예를 들어 Always write "$foo", never plain 입니다 $foo.

작성된 이 코드는 의미가 없습니다. 테스트에는 =0(실행 중인 프로세스가 없는 경우 transmission-gtk) 또는 1234=0(일치하는 프로세스가 있는 경우) 또는 123 456=0(공백이 포함되어 있더라도 쉘 용어로 단일 단어)와 유사한 단어가 포함되어 있습니다. ). 테스트의 개별 단어는 항상 올바른 것으로 간주됩니다. 문자열이 다른 문자열과 같은지 테스트하려면 다음을 작성하세요 [ "string1" = "string2" ](대괄호 양쪽과 연산자 양쪽에 공백이 있어야 함). 수치적 동등성을 테스트하려면 true -eq와 같은 연산자를 사용하십시오.[ 1 -eq 01 ]

여기에는 실행 중인 프로세스가 있는지 테스트하는 두 가지 동일한 방법이 있습니다 transmission-gtk.

  • 출력이 비어 있는지 테스트합니다.

    if [ -z "$(pidof transmission-gtk)" ]; then …
    
  • 반환 상태가 pidof0이 아닌지 테스트하여 실패를 나타냅니다. 명령의 출력은 사용되지 않으므로 /dev/null(큰 구멍)으로 리디렉션됩니다.

    if ! pidof transmission-gtk >/dev/null; then
    

답변2

bash(1)맨 페이지,확장부분,명령 대체부분:

   Command substitution allows the output of a command to replace the com-
   mand name.  There are two forms:

          $(command)
   or
          `command`

   Bash performs the expansion by executing command and replacing the com-
   mand  substitution  with  the  standard output of the command, with any
   trailing newlines deleted.

[콘크리트 블록만큼 똑똑하고 빈 문자열을 좋아하지 않기 때문에 인용합니다 .

관련 정보