El script Bash perfectamente imperfecto no puede pasar una variable al comando Renice

El script Bash perfectamente imperfecto no puede pasar una variable al comando Renice

He escrito un script bash que es 100% correcto según https://www.shellcheck.net/#. El código debe reiniciarse y luego limitarse a las aplicaciones deseadas y sus pids relativos.

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

Problema:
El resultado muestra que el comando renice está rechazando los valores de la variable "$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

Progreso
La solución parece serusar unincorrectoguion

me cambié renice -n 19 -p "$pid" && cpulimit -p "$pid" -l 20a renice -n 19 -p $pid && cpulimit -p $pid -l 20

Y ahora el resultado muestra que funciona según lo diseñado:

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

Mientras tanto https://www.shellcheck.net/#está gritando como loco

$ 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  

¿Alguna idea de por qué las comillas de las variables causaron este problema?

Respuesta1

shellcheck no sabe lo que tuquiso decir, por lo que su consejo genérico "Comilla doble para evitar la división de palabras" en realidad está funcionando en su contra. La salida de pgrep "$process_name"devuelve una lista de PID separados por espacios, quenecesidadesdebe dividirse en palabras cuando lo asigna a una matriz, pero debido a que ha puesto el valor entre comillas dobles durante la asignación, siempre permanece como una sola cadena.

información relacionada