쉘 스크립트에서 $와 함께 echo 명령 사용

쉘 스크립트에서 $와 함께 echo 명령 사용

최근에는 echo 명령을 사용하고 앞에 $를 붙였습니다. 놀랍게도 그것은 버그로 밝혀졌습니다. 내 주문은 이것이다.

# !/bin/bash
$(echo 'a')

오류는 ...

./test1.sh: line 3: a: command not found

여기서 무슨 일이 일어나고 있는지 설명할 수 있는 사람이 있습니까? 미리 감사드립니다.

답변1

$(echo a)"명령 대체"입니다. $(...)로 대체 됩니다내부 명령의 출력. 이 예의 출력은 이며 a, 쉘은 해당 출력을 실행하려고 시도합니다. 쉘이 호출된 명령을 찾을 수 없으며 a오류 메시지가 표시됩니다.

당신의 의도가 무엇인지, 무슨 일이 일어날 것으로 기대하는지 명확하지 않습니다. 이것은매우 특이한명령 대체 결과를 실행하고 싶습니다.


일부 프로그램은 셸에서 평가해야 하는 문자열을 출력합니다. 따라서 다음과 같은 코드를 볼 수 있습니다.

eval "$(ssh-agent)"

주어진 명령의 출력을 평가(실행)합니다. 이러한 명령은 엄격하게 지정된 출력을 가지며 일반적으로 이러한 방식으로 실행해도 안전한 것으로 간주됩니다. 위의 예에서 ssh-agentSSH 에이전트 프로세스가 시작되고 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')

관련 정보