Sintaxe

Comando simples

Esta é a sintaxe de um único comando em bash:

comando arg1 arg2 ... argN

Os argumentos são separados por espaços, e podem ou não ser opcionais, dependendo do comando.
Caso o argumento tenha espaços no nome, é preciso colocá-lo entre aspas simples ou duplas para que seja interpretado como um único argumento:

rm "Arquivo com espacos no nome.txt"

Ou

rm 'Arquivo com espacos no nome.txt'

Redireção

Todo comando de terminal tem 3 arquivos especiais do qual pode ler ou escrever:

  • stdin (0): entrada padrão
  • stdout (1): saída padrão
  • stderr (2): saída padrão de erro

(Os números entre parênteses são file descriptors: inteiros que representam arquivos abertos, e que têm valores fixos para esses 3 arquivos.)

Por padrão, o que se escreve em stdout ou stderr é impresso no terminal, e o que é lido de stdin é lido interativamente pelo terminal: o programa espera o usuário digitar as strings de entrada, até que se digite Ctrl+D.

Porém, é possível redirecionar qualquer um desses 3 arquivos, para que seu conteúdo seja lido de / escrito em um outro arquivo.

Para redirecionar a entrada, usamos <:

grep abcd 0< alfabeto.txt

Redireciona o arquivo de file descriptor 0 (ou seja, stdin, a entrada padrão) do comando grep para o arquivo alfabeto.txt.

É possível (e usual) omitir o file descriptor de stdin:

grep abcd < alfabeto.txt

Para redirecionar a saída, usa-se >:

echo abcdefg 1> alfabeto.txt

Mas, como no caso de stdin, é usual omitir o file descriptor:

echo abcdefg > alfabeto.txt

Se já existia um arquivo com esse nome, seu conteúdo original é sobrescrito:

echo abcdefg > alfabeto.txt
echo hijklmn > alfabeto.txt
cat alfabeto.txt

Produz a saída

hijklmn

Para que a redireção adicione o conteúdo ao fim do arquivo em vez de sobrescrevê-lo, usa-se >>:

echo abcdefg >> alfabeto.txt
echo hijklmn >> alfabeto.txt
cat alfabeto.txt

Produz a saída

abcdefg
hijklmn

Podemos redirecionar tanto a saída quanto a entrada:

grep abcd < alfabeto.txt > saida.txt

Da maneira análoga a stdout, podemos redirecionar a saída padrão de erro (stderr), mas para isso é preciso explicitar o file descriptor antes do sinal de redireção:

./a.out 2>log.txt

O uso mais comum da redireção da saída de erro é com /dev/null - o buraco negro na forma de arquivo: toda tentativa de leitura ou escrita nesse arquivo falha. Por isso, 2>/dev/null é usado para omitir as mensagens de erro de um comando.

Podemos redirecionar a saída de erro para a saída padrão:

./a.out 2>&1

Note o uso de & antes do 1: se não usássemos isso, a saída padrão de erro seria redirecionada para um arquivo cujo nome é realmente 1.

Pipelines

Pipelines são a forma mais comum de encadear comandos em Unix. Uma pipeline é denotada pela barra vertical |, e transforma a saída padrão do primeiro comando na entrada padrão do próximo:

comando1 | comando2 | comando3 | ... | comandoN

Por exemplo, se queremos imprimir apenas a primeira coluna de um arquivo csv (que tem várias entradas em cada linha separadas por vírgulas),

cat dados.csv | cut -d',' -f1

Se queremos imprimir a mesma coisa, mas apenas das linhas 2 até 5 do arquivo original,

cat dados.csv | sed -n '2,10p' | cut -d',' -f1

E assim por diante.

Por padrão, as pipelines não passam a saída de erro para o outro programa. Para fazer isso, é necessário usar uma redireção da saída de erro para a saída padrão (2>&1):

strace a.out 2>&1 | grep SIGSEGV 

Porém, é possível usar |&, que é sinônimo de 2>&1 |:

strace a.out |& grep SIGSEGV 

As pipelines refletem bem a filosofia Unix: ter vários programas pequenos que realizam uma única tarefa simples, mas que podem ser combinados de maneira flexível para realizar uma tarefa complexa - que os criadores dos programas individuais não necessariamente previram.

Encadeamento incondicional

TODO (;)

Encadeamento condicional

TODO (&& e ||)