![evalはエコーを評価しませんか? [コピー]](https://linux33.com/image/123742/eval%E3%81%AF%E3%82%A8%E3%82%B3%E3%83%BC%E3%82%92%E8%A9%95%E4%BE%A1%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
私は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
。;
各コマンドの後にシャットダウンを逃しました。
これにより、スクリプトは目的のタスクを実行します。
セミコロンがない場合、シェルは改行が削除された文字列(ここで説明されている)のコマンドを1つのコマンドとして実行します。
答え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
。