최근에는 $ 접두사에 echo 명령을 사용했습니다. 놀랍게도 그 결과는 오류였습니다. 내 명령은 다음과 같습니다.

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

오류는 ..

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

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

Answer

$(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).

evalssh-agent 명령의 출력은 더 복합적인 명령이므로 $(ssh-agent)를 사용하면됩니다. eval가 없으면 ; 명령 종결자는 특별합니다.

예 :

$ s="echo hello; echo world" $ $s hello; echo world $ eval "$s" hello world 

댓글

  • OTOH, eval "$(dircolors)"는 합당한 조치입니다. gpg-agent와 같이 해당 패턴을 따르는 여러 다른 명령과 동일합니다.
  • @derobert Yes 및 $(ssh-agent). 좋은 지적입니다.

답변

set -x를 사용하여 셸이 수행하는 작업을 확인합니다.

set -x $(echo "a") ++ echo a + a 

셸은 echo a를 실행하고 명령 줄에 출력을 표시합니다. 이것은 다음 명령 줄을 실행하려고 시도한 것과 동일합니다.

a 

셸이 명령을 찾습니다. a (함수, 별칭 및 해시 목록 이전에도)를 찾지 못해 오류가 발생합니다.

출력이 유효한 명령이면 작동합니다.

$(echo "ls") 

댓글

  • 실제로 $ other를 사용한 다음 변수를 호출하는 것에 대해 말씀해 주시겠습니까?
  • @Ashu 분명히 명령 대체에도 사용됩니다 – 귀하의 경우. 계산 (echo $((1+2+3))), 문자열 생성 ($'foo\nbar' / $"foo") 및 (덜 셸 관련) bash가 이해하는 정규식 ([[ foo =~ ^f..$ ]])에서. 또한 여러 가지 방법으로 변수를 수정하는 데 사용됩니다. ${foo#bar}

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다