完全不完美的 Bash 腳本無法將變數傳遞給 Renice 命令

完全不完美的 Bash 腳本無法將變數傳遞給 Renice 命令

我寫了一個 bash 腳本,根據 100% 正確https://www.shellcheck.net/#。程式碼應該 renice,然後 cpulimit 任何所需的應用程式及其相對 pid。

#!/bin/bash
INTERVAL=10
PROCESSES_TO_WATCH=gnome-shell
set -x

while sleep $INTERVAL; do
        for process_name in $PROCESSES_TO_WATCH; do
        pid_list=("$(pgrep "$process_name")")

        # Don't do anything if no running process found
        [ ${#pid_list[@]} -le 0 ] && continue

                for pid in "${pid_list[@]}"; do
                renice -n 19 -p "$pid" && cpulimit -p "$pid" -l 20  

                done
        done
done
#EOF

問題:
輸出顯示 renice 指令拒絕“$pid”變數值:

+ sleep 10
+ for process_name in $PROCESSES_TO_WATCH
+ pid_list=("$(pgrep "$process_name")")
++ pgrep gnome-shell
+ '[' 1 -le 0 ']'
+ for pid in "${pid_list[@]}"
+ renice -n 19 -p '1797
3709
3074206'
renice: bad process ID value: 1797
3709
3074206

進步
解決方案似乎是使用一個不正確腳本

renice -n 19 -p "$pid" && cpulimit -p "$pid" -l 20改為 renice -n 19 -p $pid && cpulimit -p $pid -l 20

現在輸出顯示它按設計工作:

root@machine# /usr/local/bin/process-leash.sh 
+ sleep 10
+ for process_name in $PROCESSES_TO_WATCH
+ pid_list=("$(pgrep "$process_name")")
++ pgrep gnome-shell
+ '[' 1 -le 0 ']'
+ for pid in "${pid_list[@]}"
+ renice -n 19 -p 1797 3709 3074206
1797 (process ID) old priority 0, new priority 19
3709 (process ID) old priority 0, new priority 19
3074206 (process ID) old priority 0, new priority 19
+ cpulimit -p 1797 3709 3074206 -l 20
Process 1797 detected

同時,https://www.shellcheck.net/#它正在尖叫著

$ shellcheck myscript
 
Line 14:
                renice -n 19 -p $pid && cpulimit -p $pid -l 20  
                                ^-- SC2086 (info): Double quote to prevent globbing and word splitting.
                                                    ^-- SC2086 (info): Double quote to prevent globbing and word splitting.

Did you mean: (apply this, apply all SC2086)
                renice -n 19 -p "$pid" && cpulimit -p "$pid" -l 20  

有什麼想法為什麼變數上的引號會導致這個問題嗎?

答案1

shellcheck 不知道你做什麼意思是,因此它的通用“雙引號以防止分詞”建議實際上對您不利。的輸出pgrep "$process_name"傳回一個以空格分隔的 PID 列表,其中需要當您將其分配給數組時進行分詞,但由於您在分配過程中用雙引號引用了該值,因此它始終保持單個字串。

相關內容