나는 명령을 시도하고있다
$ b=5; echo `$b`;
-bash: 5: command not found
그러나 예상대로 5를 인쇄하지 않습니다. 내가 여기서 무엇을 놓치고 있습니까?
`(backquote / backtick)는 명령에서 무엇을 의미합니까? `
내 명령 을 평가하고 출력으로 바꿉니다.
나는 명령을 시도하고있다
$ b=5; echo `$b`;
-bash: 5: command not found
그러나 예상대로 5를 인쇄하지 않습니다. 내가 여기서 무엇을 놓치고 있습니까?
`(backquote / backtick)는 명령에서 무엇을 의미합니까? `
내 명령 을 평가하고 출력으로 바꿉니다.
답변:
백틱 사이의 텍스트는 명령 출력 (마지막 줄 바꿈 문자 제외)으로 실행되고 대체되며 출력에 NUL 문자가 있으면 쉘 동작이 달라집니다. 이를 명령 출력으로 대체 하므로 명령 대체 라고 합니다. 따라서 5를 인쇄하려면 백틱을 사용할 수 없으며 echo "$b"
따옴표를 사용하거나 따옴표를 삭제하고 사용할 수 있습니다 echo $b
.
보시다시피, $b
5를 포함 하므로 백틱을 사용하면 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을에서, 단어 분할) 변수 확장과 같은 단어 분할 및 파일 이름 생성 될 수 있습니다.
you can use quotation marks, like echo "$b"
=> ""는 특별한 작업을 수행합니까? echo $b
잘 작동하는 것 같습니다 .
echo
되지 않고 명령이 인수 수를 신경 쓰지 않기 때문에 b
공백이 있으면 여러 인수를 가져 와서 여전히 인쇄합니다. 다른 명령 (특히 변수가 설정되지 않은 경우)의 경우에는 그렇지 않을 수 있으므로 항상 변수를 따옴표로 묶는 경향이 있습니다.
(POSIX)
실제 표준에 대한 링크 라면 좋을 것입니다.
당신의 라인이 단계적으로 설명해야합니다.
$ b=5; echo `$b`;
b
를 5로 설정$b
(효과적으로 실행 5
)echo
위의 평가 결과를 보여줍니다.예, 얻은 결과가 예상됩니다. 생각했던 실제 명령이 아닌 변수의 내용을 평가하고 있습니다. 백틱에 넣은 모든 것은 새로운 (서브) 쉘에서 시뮬레이션 평가 (실행)됩니다.