최근에는 echo 명령을 사용하고 앞에 $를 붙였습니다. 놀랍게도 그것은 버그로 밝혀졌습니다. 내 주문은 이것이다.
# !/bin/bash
$(echo 'a')
오류는 ...
./test1.sh: line 3: a: command not found
여기서 무슨 일이 일어나고 있는지 설명할 수 있는 사람이 있습니까? 미리 감사드립니다.
답변1
$(echo a)
"명령 대체"입니다. $(...)
로 대체 됩니다내부 명령의 출력. 이 예의 출력은 이며 a
, 쉘은 해당 출력을 실행하려고 시도합니다. 쉘이 호출된 명령을 찾을 수 없으며 a
오류 메시지가 표시됩니다.
당신의 의도가 무엇인지, 무슨 일이 일어날 것으로 기대하는지 명확하지 않습니다. 이것은매우 특이한명령 대체 결과를 실행하고 싶습니다.
일부 프로그램은 셸에서 평가해야 하는 문자열을 출력합니다. 따라서 다음과 같은 코드를 볼 수 있습니다.
eval "$(ssh-agent)"
주어진 명령의 출력을 평가(실행)합니다. 이러한 명령은 엄격하게 지정된 출력을 가지며 일반적으로 이러한 방식으로 실행해도 안전한 것으로 간주됩니다. 위의 예에서 ssh-agent
SSH 에이전트 프로세스가 시작되고 ssh
클라이언트가 나중에 에이전트를 사용하는 데 필요한 적절한 환경 변수를 설정하는 일부 명령이 출력됩니다. 예를 들면 다음과 같습니다.
SSH_AUTH_SOCK=/tmp/ssh-Ppg1EO5eRIZp/agent.6017; export SSH_AUTH_SOCK;
SSH_AGENT_PID=6018; export SSH_AGENT_PID;
echo Agent pid 6018;
그런 다음 평가를 통과하십시오 eval
.
eval
단순히 $(ssh-agent)
명령의 출력이 ssh-agent
복합 명령에 가깝기 때문에 여기에 사용되었습니다. 그렇지 않은 경우 eval
명령 ;
종결자가 특별해집니다.
예:
$ s='echo hello; echo world'
$ $s
hello; echo world
$ eval "$s"
hello
world
답변2
다음 명령을 사용하여 set -x
쉘이 수행하는 작업을 확인할 수 있습니다.
set -x
$(echo 'a')
++ echo a
+ a
쉘이 실행되어 echo a
명령줄에 출력을 표시합니다. 이는 다음 명령줄을 실행하려는 것과 동일한 효과를 갖습니다.
a
a
셸은 경로에서(함수, 별칭 및 해시 목록 이전에도) 명령을 찾지만 찾지 못하므로 오류가 발생합니다.
출력이 유효한 명령이면 유효한 것입니다.
$(echo 'ls')