Bash
美元!在命令行上不起作用
我直接在 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?
我無法用
bash
4.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;我修好了