백틱 내에 중첩 에코 명령

백틱 내에 중첩 에코 명령

내 쉘에 추가 에코가 인쇄되는 이유를 알고 싶습니다. bash버전 4.2.46(1)을 사용하고 있습니다 .

echo `echo `echo $SHELL``

흥미로운 문제는 교체하면 추가 에코가 인쇄되지 않는다는 '``'것 입니다.$()

echo $(echo `echo $SHELL`)

echo홀수 명령 번호에 추가 에코가 인쇄되는 것을 발견했습니다 .

echo `echo `echo `echo `echo $SHELL````

답변1

두 가지 버전:

echo `echo `echo $SHELL``

그리고

echo $(echo `echo $SHELL`)

동등하지 않습니다. 첫 번째백틱 명령 대체또 다른 백틱이 보이면 바로 종료하세요.

이전 백틱 대체 형식을 사용하는 경우 [...] 선행 백슬래시가 없는 첫 번째 백틱은 명령 대체를 종료합니다.

첫 번째 버전은 실제로 다음과 동일합니다.

echo $(echo )echo $SHELL$()

그렇기 때문에 출력에 "echo"가 표시됩니다. (교체 후 추가 공백을 제거한 후) 실행하게 되는 명령은 다음과 같습니다.

echo echo /bin/bash

따라서 명령을 직접 작성한 것처럼 출력은 "echo /bin/bash"입니다.


백틱을 중첩해야 하는 경우 내부 쌍을 백슬래시하여 이스케이프할 수 있습니다. 첫 번째 명령은 다음과 같이 올바르게 작성할 수 있습니다.

echo `echo \`echo $SHELL\``

하지만 권장하지는 않습니다. $( ... )중첩용으로 설계되었습니다.

답변2

동등하다

echo $(echo `echo $SHELL`)

또는 더 나은 방법은 다음과 같습니다.

echo $(echo $(echo $SHELL))

백틱에서는 다음과 같습니다.

$ echo `echo \`echo $SHELL\``
/bin/sh

이것이 백틱의 주요 문제점입니다.

 Where exactly does a backtick start or end?

이것이 쉘이 행을 올바르게 이해하지 못하는 이유입니다. 쉘은 이 행을 다음과 같이 해석합니다.

echo echo `echo $SHELL`

관련 정보