我有以下行:
isUbuntu=$(cat /etc/os-release | grep '^ID=ubuntu$' | wc -l)
它工作正常
现在,通过 VSC 并且主要使用 ShellCheck 扩展会显示以下两个警告消息:
对于后者:
Consider using 'grep -c' instead of 'grep|wc -l'.
shellcheck(SC2126)
因此命令改为:
isUbuntu=$(cat /etc/os-release | grep -c '^ID=ubuntu$')
而且它仍然运行良好
对于前者:
Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
shellcheck(SC2002)
其中提出了两条应用建议:
- 一:与
cmd < file | ..
然后,如果cmd是cat
命令,则命令更改为:
isUbuntu=$(cat < /etc/os-release | grep -c '^ID=ubuntu$')
并且它仍然运行良好。因此,到目前为止,两个原始消息都是固定的。
现在这篇文章的原因是有关第二个建议:
- 二:与
cmd file | ..
难道不是cat /etc/os-release
从一开始就应用了相同的命令吗?我错过了什么吗?因此:
问题
- 如何正确运用该
cmd file | ..
建议?
请举个例子
在这种情况下
cmd
是指 grep 本身。grep 可以从文件中读取,因此您的完整命令可以(并且可以说应该)简单如下:它建议的原因
< file
是有些命令不能接受文件作为参数,所以您可以使用< file
将其发送到 stdin 而不是cat file
。此外,即使一些可以接受文件作为命令行参数的命令在通过 stdin 提供时行为也会有所不同,因此您可能更喜欢其中一个或另一个。
tr
是后者的一个例子。你不能这样做:tr '-' '+' file
但你可以这样做:
tr '-' '+' <file
参见:UUOC
当然,正如 Stéphane 指出的那样,/etc/os-release 旨在用于 shell 脚本,因此您可以:
或者