Was bedeutet die Shellcheck-Warnung SC2129 „Erwägen Sie die Verwendung der Datei { cmd1; cmd2; } >> anstelle einzelner Weiterleitungen.“?

Was bedeutet die Shellcheck-Warnung SC2129 „Erwägen Sie die Verwendung der Datei { cmd1; cmd2; } >> anstelle einzelner Weiterleitungen.“?

Ich habe diese shellcheckWarnung 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 shellchecknicht nur Fehler in Ihrem Code erkennt, sondern auch Leistungsverbesserungen vorschlägt. In diesem Fall $IconsRawwurde der Dateiname mit jedem printfund 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 printfund es ist effizienter, einfach Folgendes zu tun:

printf '%s|%s|%s|%s|%s|%s|%s\n' \
      'FALSE' "$i" "${File##*/}" "$Linkless" \
      "$Date" "$X" "$Y" >> "$IconsRaw"

verwandte Informationen