É verdade concluir que existem 4 tipos de **saída** que podemos referenciar para um arquivo no Linux?

É verdade concluir que existem 4 tipos de **saída** que podemos referenciar para um arquivo no Linux?

É verdade concluir que existem 4 tipos desaída de fluxopodemos fazer referência a um arquivo no Linux, se não quisermos que eles apareçam na CLI após executar seu comando?

Possíveis referências a um arquivo:

  1. Todas as saídas de fluxo
  2. Somente stderr
  3. Somente stdout (incluindo o resultado final do stdout).
  4. stdout e stderr (excluindo o resultado final do stdout).

Notas:

Um exemplo para o número 4 pode serfind / -type f -name php.ini 2>/dev/null . Pelo que entendi, com este comando não obtemos stderr e nem stdout (além doresultado final do stdoutque neste caso é o arquivo que procuramos, caso tenha sido encontrado).

Responder1

Existem dois fluxos de saída conectados a cada processo em um sistema Unix:saída padrão(stdout, descritor de arquivo 1) eerro padrão(stderr, descritor de arquivo 2). Eles podem ser redirecionados independentemente um do outro.Entrada padrãousa o descritor de arquivo 0.

  • Para redirecionar a saída padrão para o arquivo file, use >fileou o mais explícito 1>file. Substitua filepor /dev/nullpara descartar os dados.
  • Para redirecionar o erro padrão para o arquivo file, use 2>file.
  • Para redirecionar o erro padrão para onde quer que a saída padrão esteja indo, use 2>&1.
  • Para redirecionar a saída padrão para onde quer que o erro padrão esteja, use 1>&2.

Não existe o conceito de “resultado final” de um fluxo ou processo. Suponho que tudo o que é enviado para a saída padrão pode ser considerado o "resultado" de um processo, a menos que também envie dados para algum arquivo que ele abre sozinho ou tenha outros efeitos colaterais (como desvincular um arquivo de um diretório, no caso de rm, ou lidar com uma série de conexões de rede, no caso de sshd). Um processo também retorna um status de saída (zero para "sucesso" e diferente de zero para "falha") que pode ser visto como "o resultado" desse processo, mas isso não está necessariamente relacionado aos fluxos de saída do processo.

Os fluxos também podem ser redirecionados emmodo anexar, o que significa que se o redirecionamento for para um arquivo, esse arquivo não será inicialmente truncado e todos os dados no fluxo serão anexados ao final do arquivo. Faz-se isso usando >>fileem vez de >file.

Na nota da pergunta, o comando

find / -type f -name php.ini 2>/dev/null

é dada. Isso redireciona (descarta)apenaserro padrão. O fluxo de saída padrão não é redirecionado e, portanto, estará visível, em sua totalidade, no console ou terminal. Se fosse uma parte intermediária de um pipeline, o fluxo de saída padrão seria alimentado na entrada padrão do próximo comando no pipeline.

Então, para concluir, eu diria que hádois(não quatro) fluxos de saída. Estes podem ser redirecionados de forma independente de várias maneiras, o que inclui o descarte do seu conteúdo.

Responder2

Todoprocessopode usar, por convenção, três descritores de arquivo padrão. Esses descritores de arquivo estão disponíveis como fluxos: stdin, stdoute stderr.

Por padrão, quando você inicia um processo a partir de um shell (CLI), o primeiro é conectado à entrada do seu terminal (ou emulador de terminal como o xterm) e os outros dois são conectados à saída do seu terminal.

Você pode instruir o shell para redirecioná-los para outro lugar, por exemplo, para /dev/null(onde eles simplesmente serão engolidos). E você pode fazer isso de forma independente para stdoute stderr. Portanto, para este caso, existem de fato quatro possibilidades:

command 
command > /dev/null
command 2> /dev/null
command > /dev/null 2> /dev/null

Mas nada impede que você redirecione um ou ambos para outro lugar:

command > /tmp/myout 2> /tmp/myerr

Nesse caso, você também não obterá saída em seu terminal, mas poderá lê-la posteriormente nos arquivos /tmp/myoute /tmp/myerr.

Responder3

A situação é mais simples e complicada do que sua pergunta sugere. Parafraseando o queKusalanandadiz ema resposta dele, existem dois fluxos de E/S (descritores de arquivo) padrão (convencionais) que são convencionalmente configurados e usados ​​para saída: stdout (descritor de arquivo 1) e stderr (descritor de arquivo 2). Nossa pergunta canônica, Quais são os operadores de controle e redirecionamento do shell?, discute como redirecioná-los. Ingenuamente, podemos enumerar cinco combinações distintas:

╔══════════════════════════════╦═════════════════════════════════════════════╗
║                              ║                   stderr                    ║
║                              ╟─────────────────────┬───────────────────────╢
║                              ║       default       │                       ║
║                              ║ (same as the shell) │       redirected      ║
╠════════╤═════════════════════╬═════════════════════╦═══════════════════════╣
║        │       default       ║                     ║                       ║
║        │ (same as the shell) ║          1          ║           2           ║
║        ├─────────────────────╠═════════════════════╬═══════════════════════╣
║ stdout │                     ║                     ║ 4. redirected         ║
║        │                     ║                     ║    to the same file   ║
║        │      redirected     ║          3          ╟───────────────────────╢
║        │                     ║                     ║ 5. redirected         ║
║        │                     ║                     ║    to different files ║
╚════════╧═════════════════════╩═════════════════════╩═══════════════════════╝

mas se você contar /dev/nullcomo sendo diferente de um arquivo, e o modo anexar como um caso especial, e o modo leitura-gravação como sendo diferente do modo somente gravação, e os pipes como sendo diferentes dos arquivos, então o número de combinações aumenta exponencialmente. No entanto, como afirmado repetidamente, “resultado final do stdout” não é uma frase padrão Unix/Linux/bash.

Só dois?

As outras respostas (talvez sabiamente) restringiram-se a stdout e stderr (descritores de arquivo 1 e 2). Eu (imprudentemente?) Acredito que uma resposta completa a esta pergunta deveria abordar o fato de que outros descritores de arquivos estão disponíveis - até centenas, milhares ou até mesmomais de um milhão. Por exemplo, se você executar um comando como diff file1 file2, o diffprograma abrirá file1e file2, e o kernel provavelmente atribuirá os descritores de arquivo 3 e 4. A diferença é que apenas os descritores de arquivo 0, 1 e 2 são pré-definidos. O redirecionamento de descritores de arquivo superiores a 2 é discutido nos seguintes locais:

Por exemplo, veja este exemplo de um descritor de arquivo alto:

$ gato canino.c
#include <stdio.h>
#include <string.h>

principal()
{
        int eu, len;
        char msg[] = "Olá, cachorro.\n";

        len = strlen(mensagem);
        i = escrever(17, mensagem, len);
        se (i == len)
                printf("Sucesso! i = %d = len\n", i);
        senão se (eu == -1)
            {
                printf("Erro! i = %d (len = %d)\n", i, len);
                erro("");
            }
        outro
                printf("Resultado inesperado: i = %d, len = %d\n", i, len);
}

$ fazer canino
cc canino.c -o canino

$ ./canino
Erro! eu = -1 (len = 12)
Descritor de arquivo incorreto

$ ./canino 17> animal
Sucesso! eu = 12 = comprimento

$ ls -l
total 70
-rw-r--r-- 1meu nome de usuário meu nome de grupo    12 de abril 12 13:36 animal
-rwxr-xr-x 1meu nome de usuário meu nome de grupo67067 12 de abril 13:36 canino
-rw-r--r-- 1meu nome de usuário meu nome de grupo   358 12 de abril 13:36 canino.c

$ animal gato
Olá, cachorro.

Aviso: não tenho certeza se o procedimento acima funcionará para todas as versões de todos os shells.

Os programas padrão não gravam em descritores de arquivo superiores a 2 (a menos que obtenham esse descritor de arquivo do kernel abrindo um arquivo, estabelecendo uma conexão de rede ou algo parecido). Mas, se você tiver um programa (não padrão) que faça isso, poderá redirecionar esses descritores de arquivo.

E, se você tiver apenas 100 descritores de arquivo e considerar apenas se cada um deles é redirecionado ou não, você terá mais de um não-milhão (1.000.000.000.000.000.000.000.000.000.000) de combinações possíveis.

informação relacionada