Quoting

具有多個參數替換的 Xargs - 在 sh -c ‘…’ 之後使用環境變數參數

  • July 24, 2017

這是我的命令:

find $1 -name "*.html"  | sort -n | xargs -I {} sh -c 'echo "Dumping file: "{} >> "$2"; w3m {} >> "$2" 2>&1'

在哪裡:

$1 是我將在其中查找副檔名為 .html 的文件的路徑

$2 是我要記錄資訊的文件(轉儲文件:*html 和此 html 文件中包含的資訊)

問題是 $2 沒有被解釋。可能是因為這個變數在’…‘之間我試過用雙引號但是命令不起作用。

有人知道如何在我的命令行中傳遞 $2 的資訊嗎?

find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 -n 1 sh -c '
  echo "Dumping file: $2" >> "$1"; w3m "$2" >> "$1" 2>&1
' sh "$2"

另一種優化可以是:

find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 -n 1 sh -c '
  exec 1>> "$1" 2>&1
  echo "Dumping file: $2"
  w3m "$2"
' sh "$2"

因為這兩個命令都使用它們的文件描述符 1 和 2 做同樣的事情,所以我們最好在一開始就在一個地方做echow3m

您還可以避免sh每個文件執行一個:

find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 sh -c '
  out=$1; shift
  for file do
    echo "Dumping file: $file"
    w3m "$file"
  done >> "$out" 2>&1
' sh "$2"

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