eval은 에코를 평가하지 않습니까? [복사]

eval은 에코를 평가하지 않습니까? [복사]

저는 API 액세스 토큰을 bash 변수에 저장하는 것을 작성하려고 하므로 ssh-agent여러분이 사용할 곳을 모델링하고 있습니다 eval.

SSH 에이전트

단독으로 실행 하면 ssh-agent다음과 같이 출력됩니다.

SSH_AUTH_SOCK=/tmp/ssh-XXXXXXXXXXXX/agent.NNNNN; export SSH_AUTH_SOCK;
SSH_AGENT_PID=NNNNN; export SSH_AGENT_PID;
echo Agent pid NNNNN;

으로 실행하면 다음과 같이 eval $(ssh-agent)출력됩니다.

Agent pid NNNNN

...그리고 eval현재 셸에서 환경 변수를 설정한 결과입니다.

내 스크립트

내 스크립트의 끝은 다음과 같습니다( $JSON일부 이전 컬 명령에서).

cat <<EOF
API_ACCESS_TOKEN=$(echo $JSON | jq '.access_token')
API_EXPIRES_AT=$(echo $JSON | jq '.expires_at')
export API_ACCESS_TOKEN API_EXPIRES_AT
echo OK
EOF

eval $(./auth)올바르게 설정되었으며 $API_ACCESS_TOKEN를 사용하여 실행할 때 $API_EXPIRES_AT( eval작동합니다)하지만 "OK"가 인쇄되지 않습니다..

내가 뭘 잘못했나요?

답변1

출력을 다시 살펴보십시오 ssh-agent. ;각 명령 후에 종료를 놓쳤습니다 .

이를 통해 스크립트는 원하는 작업을 수행합니다.

세미콜론이 없으면 쉘은 줄 바꿈이 제거된 문자열(여기에 설명되어 있음)의 명령을 하나의 명령으로 실행합니다.

답변2

이것도 단어 분할 문제인 것 같습니다. 스크립트 출력은 (본질적으로) 다음과 같습니다.

VAR=foo
export VAR
echo OK

eval그러나 따옴표 없이 명령 대체를 사용했기 때문에 다음을 입력한 것처럼 분할되어 다른 단어가 제공됩니다 .

eval VAR=foo export VAR echo OK

이후 Bash는 declare표시 echo되고 OK내보내지지만 설정되지는 않습니다.

$ declare -p echo
declare -x echo

따라서 명령 대체( eval "$(./auth)")를 인용하거나 거기에 세미콜론을 넣어야 합니다 ssh-agent.

관련 정보