Bash

如何使用 xargs 即時設置和更改變數?

  • May 18, 2020

我正在嘗試docker save -o在一個命令中對 docker-compose.yaml 文件中的所有圖像執行。

我設法做的是:

cat docker-compose.yaml | grep image這將給出:

image: hub.myproject.com/dev/frontend:prod_v_1_2
image: hub.myproject.com/dev/backend:prod_v_1_2
image: hub.myproject.com/dev/abd:v_2_3
image: hub.myproject.com/dev/xyz:v_4_6

我需要為每個圖像執行以下命令:

docker save -o frontend_prod_v_1_2.tar hub.myproject.com/dev/frontend:prod_v_1_2

我設法實現的是:

cat docker-compose.yml | grep image | cut -d ':' -f 2,3這使:

hub.myproject.com/dev/frontend:prod_v_1_2
hub.myproject.com/dev/backend:prod_v_1_2
hub.myproject.com/dev/abd:v_2_3
hub.myproject.com/dev/xyz:v_4_6

我可以進一步做:

cat docker-compose.yml | grep image | cut -d ':' -f 2,3 | cut -d '/' -f3 | cut -d ':' -f1,2

這使:

frontend:prod_v_1_2
backend:prod_v_1_2
abd:v_2_3
xyz:v_4_6

然後我不知道該怎麼辦。我曾嘗試使用xargsto 作為變數傳遞,但我不知道如何在命令行中即時將 xargs 從更改為frontend:prod_v_1_2to 。frontend_prod_v_1_2.tar另外,最後我仍然需要完整的圖像名稱和標籤。

我正在尋找類似的東西:

cat docker-compose.yml | grep image | cut -d ':' -f 2,3 | xargs -I {} docker save -o ``{} | cut -d '/' -f3 | cut -d ':' -f1,2 | xargs -I {} {}.tar`` {}

任何 bash 魔術師都可以提供提示嗎?

隨著您添加越來越多的命令,您的管道方法可能會變得複雜。只需使用本機 shell 的能力,在這種情況下bash進行這樣的操作。將 的輸出通過管道傳輸grep image docker-compose.yml到一個while..read循環中並用它執行替換。

在適當的 shell 腳本中,這可以作為

#!/usr/bin/env bash
# '<(..)' is a bash construct i.e process substitution to run the command and make 
# its output appear as if it were from a file
# https://mywiki.wooledge.org/ProcessSubstitution

while IFS=: read -r _ image; do
   # Strip off the part up the last '/'
   iname="${image##*/}"
   # Remove ':' from the image name and append '.tar' to the string and 
   # replace spaces in the image name
   docker save -o "${iname//:/_}.tar" "${image// }"
done < <(grep image docker-compose.yml)

在命令行上,而不是xargs我會awk直接使用來執行 docker save 操作

awk '/image/ { 
      n = split($NF, arr, "/"); 
      iname = arr[n]".tar"; 
      sub(":", "_", iname); fname = $2;  
      cmd = "docker save -o " iname " " fname; 
      system(cmd);
   }' docker-compose.yml

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