Ich habe diese shellcheck
Warnung erhalten, die ich nicht verstehe:
In /mnt/e/bin/iconic line 540:
printf "FALSE|" >> "$IconsRaw" # Select field number 1
^-- SC2129: Consider using { cmd1; cmd2; } >> file instead of individual redirects.
Ich habe bemerkt, dass viele von uns hierShellcheckum unsere Bash-Skripte/Shell-Befehle zu reparieren, also hoffe ich, dass die Frage zum Thema passt.
Gemäß den Kommentaren zum Posten des relevanten Abschnitts des Bash-Skripts:
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
Lösung
Dank akzeptierter Antworten und Kommentare habe ich gelernt, dass dies shellcheck
nicht nur Fehler in Ihrem Code erkennt, sondern auch Leistungsverbesserungen vorschlägt. In diesem Fall $IconsRaw
wurde der Dateiname mit jedem printf
und viele Male geöffnet und geschlossen echo
.
Der effizientere Bash-Code:
# X,Y screen coordinates invalid on backup files ending with "~"
! [[ "$X" == "?" || "$Y" == "?" ]] && { let i++; echo \
"FALSE|$i|${File##*/}|$Linkless|$Date|$X|$Y" >> "$IconsRaw"; }
Antwort1
Ich gehe davon aus, dass Ihr Skript mehrere Instanzen von hat >> "$IconsRaw"
. Diese Meldung schlägt vor, die Ausgabe nur einmal umzuleiten und die Befehle in einer Subshell zu gruppieren. Vermutlich, um den Aufwand zu vermeiden, der durch das mehrmalige Öffnen und Schließen der Datei entsteht.
Also statt dessen:
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
Das:
{
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"
Aber das ist auch eine unnötige Wiederholung printf
und es ist effizienter, einfach Folgendes zu tun:
printf '%s|%s|%s|%s|%s|%s|%s\n' \
'FALSE' "$i" "${File##*/}" "$Linkless" \
"$Date" "$X" "$Y" >> "$IconsRaw"