GNU/Linux
 
 
Redirecionamento
(entrada/saída padrão/erro, pipe, tee, xargs etc)

Redirecionamento ou devio é ...



Saída Padrão (STDOUT)
$ ls -R /etc > /tmp/teste (será criado um arquivo "/tmp/teste" que conterá a saída padrão do "ls". Se o arquivo já existir, ele será sobrescrito)
$ ls -R /etc >> /tmp/teste (será criado um arquivo "/tmp/teste" que conterá a saída padrão do "ls". Se o arquivo já existir, a saída irá para o final dele)
# find / -name "*.gz" 1> lista.txt 2> erros.txt ()


Saída de Erro (STDOUTERR)
$ ls -R /etc 2> /tmp/teste (será criado um arquivo "/tmp/teste" que conterá a saída de erro do "ls". Se o arquivo já existir, ele será sobrescrito)
$ ls -R /etc 2>> /tmp/teste (será criado um arquivo "/tmp/teste" que conterá a saída de erro do "ls". Se o arquivo já existir, a saída irá para o final dele)


Saída Padrão e de Erro em arquivos separados
$ ls /etc/* > /tmp/$$ 2> /tmp/x$$ (será criado um arquivo "/tmp/PID" que conterá a saída padrão do "ls /etc/*" e será criado um outro arquivo "/tmp/xPID" que conterá a saída de erro padrão do "ls /etc/*". Se os arquivos já existirem eles serão sobrescrito. O "$$" é uma variável que representa um número do Process Identification)
$ ls /etc/* >> /tmp/$$ 2>> /tmp/$$ (será criado um arquivo "/tmp/PID" que conterá a saída padrão do "ls /etc/*" e será criado um outro arquivo "/tmp/PID" que conterá a saída de erro padrão do "ls /etc/*". Se o arquivo já existir ele o desvio vão para o final do dele. O "$$" é uma variável que representa um número do Process Identification)


Saída Padrão e de Erro no mesmo arquivo
$ ls /var /zzz > /tmp/padraoError.txt 2>&1 (envia a saída padrão e a de erro para o arquivo /tmp/padraoError.txt. O “2>&1” conecta a saída de erro na saída padrão)
$ ls /var /zzz 2> /tmp/padraoError.txt 1>&2 (envia a saída padrão e a de erro para o arquivo /tmp/padraoError.txt. O “1>&2” conecta a saída padrão na saída de erro)
$ ls /var /zzz 2> /tmp/padraoError.txt >&2 (idem)
Obs: O ARQUIVO /tmp/padraoError.txt TERÁ O CONTEÚDO IGUAL NOS DOIS COMANDO ACIMA. The incantation 2>&1 means “Send errors (output stream number 2) to the same place ordinary output (output stream number 1) is going to.”


Entrada Padrão (STDIN)
# at 18:00 < /bin/df (AT é equivalente ao CRON, contudo executa um função/comando/script uma única vez numa data e hora específicas. Esse comando executará o "/bin/df" as 18 horas de hoje)
# mail hugo < testdisk.log (envia um e-mail para o usuário "hugo" da máq. local cujo conteúdo está dentro do arquivo "testdisk.log")
# mail hugo << FimMail (envia um e-mail para o usuário “hugo” da máquina local, sendo que este e-mail só vai terminar quanto for digitado "FimMail")

# cat /etc/passwd | sed 's/ .*//' (lista mostra somente a primeira palavra de cada linha ou pelo menos até encontrar um espaço em branco. O ".*" representa qualquer caractere, sendo que ele pode aparecer uma vez, várias vezes ou não aparecer. Em outras palavras, representa qualquer sequência de caracteres)
# sed 's/ .*//' /etc/passwd (idem)
# sed 's/ .*//' < /etc/passwd (idem, o resultado será o mesmo. O sinal < avisa ao shell que a entrada padrão será um arquivo em vez do teclado)
# sed 's/ .*//' /etc/passwd > /etc/passwd.new ; mv /etc/passwd.new /etc/passwd ((idem, redirecionando a saída padrão para "/etc/passwd.new" e depois o renomeando para "/etc/passwd"))
# sed 's/ .*//' < /etc/passwd > /etc/passwd.new ; mv /etc/passwd.new /etc/passwd (idem)

# cat test < aaa (aparecerá um erro “bash: aaa: No such file or directory”.)
# cat test << aaa (Se o arquivo não existir: aparecerá um erro, mas o arquivo não é criado, sendo que só sairá se for teclado o “aaa”. Aparece o erro “cat: test: No such file or directory”. Se o arquivo existir não aparecerá erros, mas o arquivo não é editado, sendo que só sairá se for teclado o “aaa”)


Ver
# cat > slavelist.db (o arquivo será criado e editado, sendo que só sairá se for teclado o ctrl+C. Se o arquivo existir ele será apagado e criado um novo. Se for tecla crtl+C as mudanças serão salvas)
# cat > slavelist.db << end (o arquivo será criado e editado, sendo que só sairá se for teclado o “end” ou ctrl+C. Se o arquivo existir ele será apagado e criado um novo. Se for teclado crtl+C as mudanças não serão salvas)


PIPE
# cat /etc/passwd | grep root ()
# ls / | grep lib (redireciona a saida padrao do comando "ls" como entrada para o "grep")
# ls / /a /zzz | grep lib (redireciona a saida padrao do comando "ls" como entrada para o "grep". Contudo, perceba que a saida de erro nao foi redirecionada para o "grep")
# ls / /a /zzz 2>&1 | grep lib (redireciona a saida padrao e a de erro do comando "ls" como entrada para o "grep". Agora sim, essa seria a sixtaxe para pegar a saida padrao e de erro e passa para o PIPE)
# ls / /a /zzz 2>&1 | grep zzz (para comprovar a teoria o "grep" filtrou somente a linha que continha a string "zzz" que esta contida na saida de erro do comando "ls / /a /zzz")
Obs: por padrao o PIPE so redireciona a saida padrao. Para que o PIPE tambem redirecione a saida de erro se deve usar o "2>&1")


PIPE + XARGS
# find /home/user | xargs rm -f (uma forma de remover todos os arquivos incluindo os ocultos. O comando "rm" não ver arquivos ocultos)
# find -maxdepth 1 -type f | xargs chmod a-x (maxdepth - diretória atual, ou seja, profundidade 1 e do tipo regular file. Tira a permissão de execução de todos)


PIPE + TEE
# ls | tee teste (lista na tela o conteúdo do diretório atual e também cria um arquivo "teste" com este conteúdo. Se o comando "ls" possuir uma saída de erro, o arquivo "teste" será criado, mas sem esses erros. Se o arquivo já existir, ele será sobrescrito. A diferente entre o "tee" e um ">" é que aquele mostra a saída padrão na tela). Obs: o comando tee não aceita como entrada um comando.)


COMANDOS QUE A SAÍDA JÁ É A DE ERRO OU OUTRA COISA QUE AINDA EU NÃO SEI

Existem comandos (strace, nginx -V etc) que ao serem executados já saem como se fossem de erro ou outra coisa que eu não sei o que é. Quando isso ocorre se pode fazer um truque.

# strace ls (a saída padrão e a de erro são jogados na tela)
# strace ls | grep exited --color (não consegue fazer filtro com o grep com a saída de erro)
# 2>&1 strace ls | grep exited --color (agora se consegue fazer filtro com o grep com a saída de erro)
# strace ls 2>&1 | grep exited --color (idem)
----------------------------------------------------------
# strace ls (a saída padrão e a de erro são jogados na tela)
# strace ls > /tmp/a.txt (a saída de erro jogada na tela e a padrão no "/tmp/a.txt")
# strace ls 2> /tmp/a.txt (a saída padrão é jogada na tela e a de erro no "/tmp/a.txt")
# strace ls > /tmp/a.txt 2>&1 (a saída padrão e a de erro são jogados no "/tmp/a.txt")
# strace ls 2> /tmp/a.txt 1>&2 (idem)
----------------------------------------------------------
# nginx -V (comando do NGINX que mostra várias informações do NGINX)
# nginx -V | grep --color http_stub_status_module (a saída é jogada na tela, mas não consegue fazer filtro com o grep com essa saída)
# 2>&1 nginx -V | grep --color http_stub_status_module (a saída de erro é jogada na saída padrão, fazendo o filtro com o grep de modo correto)
# nginx -V 2>&1 | grep --color http_stub_status_module (idem)
----------------------------------------------------------
# nginx -V > /tmp/a.txt (não funciona)
# nginx -V 2> /tmp/a.txt (funciona)
# nginx -V > /tmp/a.txt 2>&1 (idem)
# nginx -V 2> /tmp/a.txt 1>&2 (idem)


()
()



AGUARDE
PÁGINA EM CONSTRUÇÃO

 
 




ETI - Especialista em Tecnologia
da Informação