저는 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
.