내 친구는 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 …
반환 상태가
pidof
0이 아닌지 테스트하여 실패를 나타냅니다. 명령의 출력은 사용되지 않으므로/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.
[
콘크리트 블록만큼 똑똑하고 빈 문자열을 좋아하지 않기 때문에 인용합니다 .