백틱 이해하기 (`)


35

나는 명령을 시도하고있다

$ b=5; echo `$b`;
-bash: 5: command not found

그러나 예상대로 5를 인쇄하지 않습니다. 내가 여기서 무엇을 놓치고 있습니까?

`(backquote / backtick)는 명령에서 무엇을 의미합니까? `내 명령 을 평가하고 출력으로 바꿉니다.


8
중첩 된 대체 실행 기능을 잃을 수 있으므로 백틱은 권장하지 않습니다. Insetad, $ (somecommand)가 선호됩니다. Imho 가독성을 향상시킵니다.
Tommy

6
@Tommy, No, backticks는 중첩 될 수 있지만 특히 큰 따옴표를 사용할 때 탈출 악몽이됩니다.
Stéphane Chazelas

답변:


52

백틱 사이의 텍스트는 명령 출력 (마지막 줄 바꿈 문자 제외)으로 실행되고 대체되며 출력에 NUL 문자가 있으면 쉘 동작이 달라집니다. 이를 명령 출력으로 대체 하므로 명령 대체 라고 합니다. 따라서 5를 인쇄하려면 백틱을 사용할 수 없으며 echo "$b"따옴표를 사용하거나 따옴표를 삭제하고 사용할 수 있습니다 echo $b.

보시다시피, $b5를 포함 하므로 백틱을 사용하면 bash명령을 실행하려고 할 때 5이러한 명령이 없으므로 오류 메시지와 함께 실패합니다.

백틱의 작동 방식을 이해하려면 다음을 실행하십시오.

$ A=`cat /etc/passwd | head -n1`
$ echo "$A"

cat /etc/passwd |head -n1/etc/passwd파일의 첫 줄을 인쇄해야 합니다. 그러나 우리는 백틱을 사용하기 때문에 콘솔에서 이것을 인쇄하지 않습니다. 대신 A변수에 저장됩니다 . $A이것에 에코 할 수 있습니다 . 첫 번째 줄을 인쇄하는보다 효율적인 방법은 명령을 사용 head -n1 /etc/passwd하지만 백틱 내부의 표현이 간단하지 않아도된다는 점을 지적하고 싶습니다.

따라서 / etc / passwd의 첫 번째 행이 root:x:0:0:root:/root:/bin/bash이면 첫 번째 명령이 bash로 동적으로 대체됩니다 A="root:x:0:0:root:/root:/bin/bash".

이 구문은 Bourne 쉘의 구문입니다. 인용 및 탈출은 특히 중첩을 시작할 때 악몽이됩니다. Ksh $(...)는 현재 표준화 된 ( POSIX ) 대안을 도입 했으며 모든 쉘 (유닉스 v9의 Bourne 쉘)에서도 지원됩니다. 따라서 $(...)매우 오래된 Bourne 쉘에 이식 할 필요가 없다면 요즘 대신 사용해야합니다 .

또한의 출력 점에 유의 `...`하고 $(...), 그래서 일반적으로 목록 맥락에서 인용 될 필요가있을 것이다 단지 (단지 zsh을에서, 단어 분할) 변수 확장과 같은 단어 분할 및 파일 이름 생성 될 수 있습니다.


1
안녕하세요 @Krzysztof, 도움이되었습니다! "$ b는 5를 포함하고 있기 때문에, bash는 명령 5를 실행하려고하면"내가 찾던 정확히 것입니다
coolcric

you can use quotation marks, like echo "$b"=> ""는 특별한 작업을 수행합니까? echo $b잘 작동하는 것 같습니다 .
Tootsie Rolls

@Anita : 일반적으로 따옴표는 특수 문자를 처리하는 방식 (특히 공백)을 변경하지만이 경우 많은 문제없이 제거 할 수 있습니다. 특수 문자가 사용 echo되지 않고 명령이 인수 수를 신경 쓰지 않기 때문에 b공백이 있으면 여러 인수를 가져 와서 여전히 인쇄합니다. 다른 명령 (특히 변수가 설정되지 않은 경우)의 경우에는 그렇지 않을 수 있으므로 항상 변수를 따옴표로 묶는 경향이 있습니다.
Krzysztof Adamski

(POSIX)실제 표준에 대한 링크 라면 좋을 것입니다.
erikbwork

1
@ erikb85 :이 노트는 나에 의해 추가되지 않았습니다하지만 :) 제안 나는 링크를 편집 한
르지 아담 스키를

11

백틱은 말한대로 정확하게 수행합니다. 변수를 정수로 설정했습니다. 이 변수를 백틱에 넣으면 bash는 변수를 명령으로 실행하려고 시도합니다. 명령이 아니기 때문에 본 오류가 발생합니다.

당신이하고 싶은 것은 간단합니다 :

$ b=5; echo $b

백틱을 더 잘 이해하려면 다음과 비교하십시오.

$ b=5; a=`echo $b`; echo $a
  5

8

당신의 라인이 단계적으로 설명해야합니다.

$ b=5; echo `$b`;
  1. 변수 b를 5로 설정
  2. 평가 $b(효과적으로 실행 5)
  3. echo위의 평가 결과를 보여줍니다.

예, 얻은 결과가 예상됩니다. 생각했던 실제 명령이 아닌 변수의 내용을 평가하고 있습니다. 백틱에 넣은 모든 것은 새로운 (서브) 쉘에서 시뮬레이션 평가 (실행)됩니다.


안녕하세요 @gertvdijk, 게시물 주셔서 감사합니다! 나는`내용을 평가 한 후에 남은 것을 돌려주는 것이라고 생각했다. 그래서, 에코를 인쇄하는`$ b는 '5 반환 한 것이라고 생각
coolcric
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.