Win*_*nix 6 bash debugging output
我有这个shellcheck警告我无法弄清楚:
In /mnt/e/bin/iconic line 540:
printf "FALSE|" >> "$IconsRaw" # Select field number 1
^-- SC2129: Consider using { cmd1; cmd2; } >> file instead of individual redirects.
Run Code Online (Sandbox Code Playgroud)
我注意到我们这里的很多人都使用shellcheck来修复我们的 bash 脚本/shell 命令,所以我希望这个问题是关于主题的。
根据发布 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
Run Code Online (Sandbox Code Playgroud)
感谢接受的答案和评论,我了解到shellcheck不仅可以捕获代码中的错误,还可以提出性能改进建议。在这种情况下,文件名$IconsRaw是与每个打开和关闭多次printf和echo。
更高效的 bash 代码:
# X,Y screen coordinates invalid on backup files ending with "~"
! [[ "$X" == "?" || "$Y" == "?" ]] && { let i++; echo \
"FALSE|$i|${File##*/}|$Linkless|$Date|$X|$Y" >> "$IconsRaw"; }
Run Code Online (Sandbox Code Playgroud)
我假设您的脚本有多个>> "$IconsRaw". 该消息建议仅重定向输出一次并将命令分组到子 shell 中。大概是为了避免多次打开和关闭文件的开销。
所以,而不是这个:
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
Run Code Online (Sandbox Code Playgroud)
这个:
{
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"
Run Code Online (Sandbox Code Playgroud)
但这也是不必要的重复,printf这样做更有效率:
printf '%s|%s|%s|%s|%s|%s|%s\n' \
'FALSE' "$i" "${File##*/}" "$Linkless" \
"$Date" "$X" "$Y" >> "$IconsRaw"
Run Code Online (Sandbox Code Playgroud)