Linux
連結命令時如何在最後一個執行命令中使用多個命令的輸出?
我有以下三個命令:
給出回購名稱:
az acr repository list -n registry -o tsv --output looks like: name1 name2 ...
給出摘要程式碼:
az acr manifest list-metadata -r ${REGISTRY} --n % --query "[?tags[0]==null].digest" -o tsv --output looks like: digest1 digest2 ...
我想回顯回購名稱和摘要程式碼。
試過:
az acr repository list -n registry -o tsv \ | xargs -I% az acr manifest list-metadata -r ${REGISTRY} --n % --query "[?tags[0]==null].digest" -o tsv \ | xargs -I% echo "%: %"
實際輸出:
digest_code: digest_code
預期輸出:
repo_name: digestcode
你需要類似的東西:
export REPO az acr repository list -n registry -o tsv | while IFS= read -r REPO; do az acr manifest list-metadata -r "$REGISTRY" --n "$REPO" --query '[?tags[0]==null].digest' -o tsv | awk '{print ENVIRON["REPO"]": "$0}' done
呼叫
awk
以在每個清單命令的輸出前加上相應的儲存庫名稱。或者,如果您需要在每個 repo/digest 對上執行其他命令:
az acr repository list -n registry -o tsv | while IFS= read -r repo; do az acr manifest list-metadata -r "$REGISTRY" --n "$repo" --query '[?tags[0]==null].digest' -o tsv | while IFS= read -r digest; do other-cmd --repo "$repo" --digest "$digest" done done
使用
zsh
,您還可以執行以下操作:for repo ( ${(f)"$(az acr repository list -n registry -o tsv)"} ) { digests=( ${(f)"$(az acr manifest list-metadata -r $REGISTRY --n $repo --query '[?tags[0]==null].digest' -o tsv)"}) print -rC1 -- $repo': '$^digests }
for repo ( ${(f)"$(az acr repository list -n registry -o tsv)"} ) for digest ( ${(f)"$(az acr manifest list-metadata -r $REGISTRY --n $repo --query '[?tags[0]==null].digest' -o tsv)"}) other-cmd --repo $repo --digest $digest
在 a
Makefile
中,看起來像:target: az acr repository list -n registry -o tsv | \ while IFS= read -r repo; do \ az acr manifest list-metadata -r "$$REGISTRY" --n "$$repo" --query '[?tags[0]==null].digest' -o tsv | \ while IFS= read -r digest; do \ other-cmd --repo "$$repo" --digest "$$digest"; \ done; \ done
雖然這是在 Makefile 中的幾行,但這些行被連接在一起,尾隨
\
s 被刪除,並且在將結果傳遞給 s 之前將$$
s 更改為s ,因此需要在該內聯 shell 腳本中添加一些 s 來分隔命令。$``sh -c``;
您可能希望將程式碼放在腳本中以使其更清晰。