Ein vollkommen unvollkommenes Bash-Skript kann keine Variable an den Renice-Befehl übergeben

Ein vollkommen unvollkommenes Bash-Skript kann keine Variable an den Renice-Befehl übergeben

Ich habe ein Bash-Skript geschrieben, das laut 100 % korrekt ist https://www.shellcheck.net/#. Der Code sollte alle gewünschten Anwendungen und ihre relativen PIDs neu referenzieren und dann cpulimitieren.

#!/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

Problem:
Die Ausgabe zeigt, dass der Befehl „renice“ die Variablenwerte „$pid“ ablehnt:

+ 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

Fortschritt
Die Lösung scheint zu seinbenutze einfalschSkript

Ich wechselte renice -n 19 -p "$pid" && cpulimit -p "$pid" -l 20zu renice -n 19 -p $pid && cpulimit -p $pid -l 20

Und jetzt zeigt die Ausgabe, dass es wie vorgesehen funktioniert:

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

Inzwischen https://www.shellcheck.net/#schreit es sich die Seele aus dem Leib

$ 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  

Irgendwelche Ideen, warum die Anführungszeichen bei den Variablen dieses Problem verursacht haben?

Antwort1

Shellcheck weiß nicht, was Siegemeint, daher arbeitet der allgemeine Ratschlag „Doppelte Anführungszeichen, um Worttrennung zu vermeiden“ tatsächlich gegen Sie. Die Ausgabe von pgrep "$process_name"gibt eine durch Leerzeichen getrennte Liste von PIDs zurück, dieBedürfnissemuss bei der Zuweisung zu einem Array in Wörter aufgeteilt werden, aber da Sie den Wert bei der Zuweisung in doppelte Anführungszeichen gesetzt haben, bleibt er immer eine einzelne Zeichenfolge.

verwandte Informationen