Eu tenho a seguinte linha:
isUbuntu=$(cat /etc/os-release | grep '^ID=ubuntu$' | wc -l)
Funciona bem
Agora, através do VSC e principalmente com a extensão ShellCheck são indicadas duas mensagens de aviso conforme segue por partes:
Para este último:
Consider using 'grep -c' instead of 'grep|wc -l'.
shellcheck(SC2126)
Portanto o comando é alterado para:
isUbuntu=$(cat /etc/os-release | grep -c '^ID=ubuntu$')
e funciona bem ainda
Para o primeiro:
Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
shellcheck(SC2002)
Onde oferece duas sugestões de aplicação:
- Um : com
cmd < file | ..
Então, se cmd for o cat
comando, o comando será alterado para:
isUbuntu=$(cat < /etc/os-release | grep -c '^ID=ubuntu$')
e funciona bem ainda. Portanto, até este ponto as duas mensagens originais estão fixas.
Agora o motivo deste post é sobre a segunda sugestão:
- Dois : com
cmd file | ..
Não é o mesmo cat /etc/os-release
comando aplicado desde o início? Eu perdi alguma coisa? Portanto:
Pergunta
- Como aplicar corretamente a
cmd file | ..
sugestão?
Por favor, forneça um exemplo
Neste caso,
cmd
está se referindo ao próprio grep. grep pode ler um arquivo, então seu comando completo poderia (e provavelmente deveria ) ser simplesmente este:O motivo sugerido
< file
é porque alguns comandos não podem aceitar um arquivo como argumento, então você pode usá-< file
lo para enviá-lo para stdin em vez decat file
.Além disso, mesmo alguns comandos que podem aceitar o arquivo como argumento de linha de comando terão comportamento diferente quando for fornecido via stdin, então você pode preferir um ou outro.
tr
é um exemplo deste último. Você não seria capaz de fazer:tr '-' '+' file
mas você poderia fazer:
tr '-' '+' <file
Veja: UUOC
É claro que, como Stéphane apontou, /etc/os-release destina-se a ser usado em scripts de shell, para que você possa apenas:
ou