Bash

美元!在命令行上不起作用

  • August 17, 2017

直接在 bash 命令行提示符下執行以下命令:

$ PIDS= ;while read name; do (cd $name; npm install) & echo started install; PIDS+=($!); done < <(\ls); for pid in ${PIDS[@]}; do wait $pid; done;

我明白了:

-bash: !: event not found

我假設該!符號用於執行命令歷史記錄替換,而不是看到“$!” 首先作為變數。


如果直接在 bash 命令行上執行,如何獲取最後一個後台程序的 pid?

我無法用bash4.3 和 4.4 重現您的問題,所以這是一個通用的答案。

!您的問題是由in觸發的PIDS+=($!)!它是歷史替換的開始(預設情況下使用互動式 shell 啟用)。

要麼禁用歷史替換set +H,要麼引用!(由於前面的原因,此處不可取$)或在之後添加空格!。Bash 手冊內容如下:

!開始一個歷史記錄替換,除非後面跟著一個空格、換行符、輸入,=或者((當使用內置 shopt 啟用了 extglob shell 選項時)

您的命令行將變為:

PIDS=()
while read name; do
   (cd "$name"; npm install) &
   echo started install
   PIDS+=( $! )
done < <(\ls)
wait "${PIDS[@]}"

筆記:

  • 您不僅限於此處的一行程式碼
  • 我在變數周圍添加了適當的引號
  • 您可以一次等待多個 PID;我修好了

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