De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Rubens Queiroz de Almeida
Data de Publicação: 28 de julho de 2010
Frequentemente, fazemos uso incorreto de comandos em bash. Não que faça muita diferença, mas não custa nada aprendermos algumas regrinhas, que tornarão o nosso código mais eficiente e legível.
Muitos de nós (eu inclusive) temos o hábito de fazer coisas como:
cat arquivo.txt | wc -l
O comando cat
significa catenate
, que significa concatenar. Se
eu tenho apenas um arquivo, não preciso do cat
, posso usar o wc
diretamente:
$ wc -l arquivo.txtJá se eu quisesse contar o número de linhas em diversos arquivos, eu poderia usar o
cat
com o comandowc
:$ cat arquivo1.txt arquivo2.txt arquivo3.txt | wc -lMas tudo irá depender do que se quer fazer. O comando
wc
também pode ser usado com esta finalidade, mas a saída é ligeiramente diferente:$ wc -l /etc/passwd /etc/hosts 39 /etc/passwd 12 /etc/hosts 51 total
Com o
cat
:$ cat /etc/passwd /etc/hosts | wc -l 51
O comando
wc
é mais falante e se eu faço uso deste recurso em uma situação em que preciso apenas do número de linhas, esta verbosidade precisará ser tratada de alguma forma, o que é desnecessário.Comando ls
Um erro bem comum:
for arquivo in `ls *` do ... doneEu não preciso usar o
ls
para obter uma listagem dos arquivos em um diretório neste trecho. Eu posso fazer assim:for arquivo in * do ... doneUma outra variação desta prática, com o comando
cat
:$ cat `ls *`Porque não fazer assim?
$ cat *Cuidado com o rm
Quem nunca fez algo assim?
$ rm -rf ~/ *.trashO que a pessoa queria? Remover de seu diretório pessoal todos os arquivos terminados em
trash
. O que aconteceu? Este infeliz removeu todo o seu diretório pessoal e apagou os arquivos terminados emtrash
do diretório corrente. O causador de tudo isto foi o espaço em branco entre~/
e*.trash
. A pressa é inimiga da perfeição :-(Na verdade o que ele queria era:
$ rm -rf ~/*.trashwhile ou for?
Vejamos:
for f in `cat arquivo.txt` do ... donePodemos fazer também assim:
while read f do ... done < arquivo.txtNa primeira opção, o resultado do comando
cat arquivo.txt
, pode ser uma linha mais longa do que o seu sistema pode tratar, o que pode trazer resultados indesejáveis.Referências
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários