![백틱 내에 중첩 에코 명령](https://linux55.com/image/78836/%EB%B0%B1%ED%8B%B1%20%EB%82%B4%EC%97%90%20%EC%A4%91%EC%B2%A9%20%EC%97%90%EC%BD%94%20%EB%AA%85%EB%A0%B9.png)
내 쉘에 추가 에코가 인쇄되는 이유를 알고 싶습니다. 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`