Tengo esta shellcheck
advertencia que no puedo entender:
In /mnt/e/bin/iconic line 540:
printf "FALSE|" >> "$IconsRaw" # Select field number 1
^-- SC2129: Consider using { cmd1; cmd2; } >> file instead of individual redirects.
He notado que muchos de nosotros aquí usamoschequeo de conchapara arreglar nuestros scripts bash/comandos shell, así que espero que la pregunta sea sobre el tema.
Según los comentarios que publican la sección relevante del script bash:
if [[ "$X" == "?" || "$Y" == "?" ]] ; then
: # Bad X or Y offset usually "Link to Name.ext~" (backup name)
else
let i++
printf "FALSE|" >> "$IconsRaw" # Select field number 1
printf "%s|" "$i" >> "$IconsRaw" # 2
printf "%s|" "${File##*/}" >> "$IconsRaw"
printf "%s|" "$Linkless" >> "$IconsRaw" # 4
printf "%s|" "$Date" >> "$IconsRaw" # 5
printf "%s|" "$X" >> "$IconsRaw" # 6
echo "$Y" >> "$IconsRaw" # 7
fi
Solución
Gracias a las respuestas y los comentarios aceptados, aprendí que shellcheck
no solo detecta errores en su código, sino que también sugiere mejoras de rendimiento. En este caso, el nombre del archivo $IconsRaw
se abría y cerraba muchas veces con cada uno printf
y echo
.
El código bash más eficiente:
# X,Y screen coordinates invalid on backup files ending with "~"
! [[ "$X" == "?" || "$Y" == "?" ]] && { let i++; echo \
"FALSE|$i|${File##*/}|$Linkless|$Date|$X|$Y" >> "$IconsRaw"; }
Respuesta1
Supongo que su secuencia de comandos tiene varias instancias de >> "$IconsRaw"
. Ese mensaje sugiere redirigir la salida solo una vez y agrupar los comandos en una subcapa. Presumiblemente para evitar la sobrecarga de abrir y cerrar el archivo varias veces.
Entonces, en lugar de esto:
printf "FALSE|" >> "$IconsRaw" # Select field number 1
printf "%s|" "$i" >> "$IconsRaw" # 2
printf "%s|" "${File##*/}" >> "$IconsRaw"
printf "%s|" "$Linkless" >> "$IconsRaw" # 4
printf "%s|" "$Date" >> "$IconsRaw" # 5
printf "%s|" "$X" >> "$IconsRaw" # 6
echo "$Y" >> "$IconsRaw" # 7
Este:
{
printf "FALSE|" # Select field number 1
printf "%s|" "$i" # 2
printf "%s|" "${File##*/}"
printf "%s|" "$Linkless" # 4
printf "%s|" "$Date" # 5
printf "%s|" "$X" # 6
printf "%s\n" "$Y" # 7
} >> "$IconsRaw"
Pero eso también es una repetición innecesaria printf
y es más eficiente simplemente hacer:
printf '%s|%s|%s|%s|%s|%s|%s\n' \
'FALSE' "$i" "${File##*/}" "$Linkless" \
"$Date" "$X" "$Y" >> "$IconsRaw"