Linux

連結命令時如何在最後一個執行命令中使用多個命令的輸出?

  • September 9, 2022

我有以下三個命令:

給出回購名稱:

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

在 aMakefile中,看起來像:

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``;

您可能希望將程式碼放在腳本中以使其更清晰。

引用自:https://unix.stackexchange.com/questions/716703