Redirecionamento
Quem já sabe programar deve saber que existem três "file descriptors" abertos por padrão (pelo menos nos sistemas operacionais que conheço): stdin (standard input), stdout (standard output) e stderr (standard error). Para fins práticos, estes são considerados arquivos e você pode direcionar destes "arquivos" para outros e vice-versa.
Veja como direcionar de:
arquivo para stdin:
programa < arquivo
stdout para arquivo:
programa > arquivo
stderr para arquivo:
programa 2> arquivo
stdout para stderr:
programa 1>&2
stderr para stdout:
programa 2>&1
stdout e stderr para arquivo:
programa &> arquivo
Se você usar por exemplo find / -perm -2 > worldwritable.txt
e no
diretório não tiver um arquivo chamado "worldwritable.txt" este será
criado, a saída do comando será gravada nele e a saída de erro padrão
será impressa na tela (ou écran, se preferirem :P ). Para não ver as
mensagens de "Permission Denied" faça isso:
$ find / -perm -2 > worldwritable.txt 2> /dev/null
Ainda temos um probleminha: este comando irá mostrar também todos os links simbólicos e vários arquivos de dispositivo. Para eliminar os links simbólicos faça o seguinte:
$ find / -perm -2 ! -type l > worldwritable.txt 2> /dev/null
Você ainda pode eliminar da saída os arquivos com stick bit e os arquivos de dispositivo usando parênt... EI!! Isto aqui é sobre redirecionamento, e não sobre o find! Vá ler a man page do find! =P
Se o arquivo já existir seu conteúdo será sobregravado. Mas você pode
apenas concatenar o conteúdo no final do arquivo usando >>
. Exemplo:
$ echo " F I M D O A R Q U I V O " >> worldwritable.txt
Faça os testes e tire suas conclusões! ;)
Veja este script a seguir a execute ele usando redirecionamento na linha de comando pra ver os resultados
#!/bin/bash
# redirecionamento.sh
echo "Isto vai para a saída padrão."
echo "Isto vai para a saída de erro padrão." 1>&2
echo "Isto vai criar um arquivo e colocar esta linha nele." > ARQUIVO
echo "Esta linha vai para o final do arquivo." >> ARQUIVO
Tem um outro tipo de redirecionamento que é bastante útil. É assim:
$ programa << delimitador
Isto quer dizer que o programa vai ler o arquivo stdin até encontrar o delimitador.
Isso é muito útil para usar programas externos através de shell scripts.
Você pode, por exemplo, usar este tipo de redirecionamento para fazer um
shell script escrever um outro arquivo usando o comando cat
. Vamos a um
exemplo em que eu crio um código de programa escrito em C através do
script (note que as variáveis do script SÃO interpretadas):
#!/bin/bash
# catredir.sh
NAME=`whoami`
echo -e "\n\tCRIANDO O ARQUIVO arquivo.c\n"
# O arquivo.c terminará quando encontrar a string _EOF_
cat << _EOF_ > arquivo.c
#include
int main (void) {
printf ("\n\tPrograma que não faz nada além disso.\n");
printf ("\tFeito por $NAME\n\n");
return 0;
}
_EOF_
# O arquivo.c acabou na linha ACIMA do _EOF_
# Observe no arquivo.c o $NAME será "traduzido" para o username adequado
echo -e "\n\tCOMPILANDO O PROGRAMA\n"
gcc arquivo.c -o arquivo
echo -e "\n\tFEITO!\n"