Hoje está mais fácil o uso de
Shell Script com a vasta informação de que conseguimos na internet. Porém, as vezes, realizamos algumas operações "redundantes", ou seja, acabamos utilizar vários comandos sendo que em apenas um poderia fazer o trabalho. Essa página abordará esse quesito..
Bom, vamos lá!
Todo programa no
Linux recebe três "descritores", conforme verificado na imagem abaixo:
- Temos a Entrada Padrão, código zero, STDIN (0);
- Temos a Saída Padrão, código um, STDOUT (1);
- Temos o Erro Padrão, código dois, STDERR (2);
Podemos dizer, de forma que todos possamos entender, que a entrada padrão (STDIN) de qualquer programa é o teclado, ou seja, é pelo teclado que você entra com as informações, comandos etc.
Já a Saída Padrão e a Saída de Erro, ambos as saídas são a tela, ou seja, o valor impresso em tela são as saídas um e dois. Em STDOUT (1) é a saída positiva do comando, todo comando gera um resultado, uma saída; isso chamados de STDOUT (1).No caso dos erros gerados pelo comando, chamamos de STDERR (2). Normalmente, ambos são visualizados em tela, não diferenciamos isso com o uso normal, porém, podem ser separados. No dia-a-dia não percebemos, mas o simples fato de utilizar cat arquivo > arquivo_novo já é um redirecionamento do STDOUT (1).
STDOUT
STDERR
Vamos a prática! Utilizaremos uma situação problema corriqueira. O gerente pediu para que gerasse uma lista de todos os arquivos em seu diretório (/home/gerente/).
Uma das formas para verificar os arquivos presentes seria utilizar o ls.
ls /home/gerente/
Porém, como seria feito a lista?
Neste caso, bastaria adicionar o operador "1>" ou ">" (normalmente é utilizado o "maior >" apenas, porém, no artigo demonstrarei com o 1, pois se trata do código da saída padrão, do STDOUT (1)). Sempre que adicionar o >, saiba que o 1 está presente, pois é a saída padrão, porém omitido. Então, o comando a ser utilizado seria:
ls /home/gerentes/ 1> Arquivos_Gerente
Isto fará com que toda a saída do comando ls seja redirecionada (não será impresso em tela) para o Arquivos_Gerente.
Na mesma situação podemos inserir o uso do operador 1>> ou >>, onde o mesmo também criará o arquivo (caso não exista) e adicionará o conteúdo. No caso de já existir o arquivo, utilizando esse operador, o mesmo adicionará a lista no final do arquivo. Já o operador 1> ou > criará o arquivo e no caso de já existir com o mesmo nome, substituirá o conteúdo pelo novo (por isso requer um pouco mais de atenção neste caso, pois caso não realizado uma cópia do arquivo, não poderá ser desfeito rs).
Explicado sobre o STDOUT (1), vamos ao STDERR (2).
No caso do STDERR (2) também são saídas de comandos representadas em tela, porém, são especificamente os erros dos comandos, onde o STDOUT não filtrará:
STDERR
Como a imagem acima, esses são os STDERR (2). Normalmente muito utilizado em Shell Scripts para fazer separação dos erros para debug e afins.
Para redirecionamento, é utilizado o código 2 (2>).
Neste exemplo, utilizaremos o ls em um arquivo inexistente, conforme imagem e texto abaixo:
ls Arquivos_VOL4 2> STDERR_LS
A saída do comando será redirecionada para o arquivo STDERR_LS e seu conteúdo apresentado como:
ls: não foi possível acessar 'Arquivos_VOL4': Arquivo ou diretório inexistente
Também podemos utilizar a saída padrão e a saída de erro em um mesmo comando de redirecionamento, para isso, basta apenas adicioná-los consecutivamente:
ls Arquivos_VOL{1,4} 1> STDOUT_LS 2> STDERR_LS
No caso de realizar o direcionamento em um mesmo arquivo, é possível?
Sim, pode ser efetuado a saída STDOUT e STDERR para o mesmo arquivo, para isso, basta apenas fazer o redirecionamento do erro para a saída padrão:
ls Arquivos_VOL{1,4} 1> STDOUT_LS 2>&1
Onde você está indicando que a STDERR (2) seja redirecionada ao mesmo lugar que STDOUT (1).
ou > criará o arquivo e no caso de já existir com o mesmo nome, substituirá o conteúdo pelo novo (por isso requer um pouco mais de atenção neste caso, pois caso não realizado uma cópia do arquivo, não poderá ser desfeito rs).
Explicado sobre o STDOUT (1), vamos ao STDERR (2).
No caso do STDERR (2) também são saídas de comandos representadas em tela, porém, são especificamente os erros dos comandos, onde o STDOUT não filtrará.