完全に不完全な Bash スクリプトは Renice コマンドに変数を渡すことができません

完全に不完全な Bash スクリプトは Renice コマンドに変数を渡すことができません

私は に従って 100% 正しい bash スクリプトを作成しましたhttps://www.shellcheck.net/#。コードは renice してから、必要なアプリケーションとその相対 pid を cpulimit する必要があります。

#!/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 20renice -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のリストを返します。ニーズ配列に割り当てるときに単語に分割されるはずですが、割り当て中に値を二重引用符で囲んでいるため、常に 1 つの文字列のままになります。

関連情報