AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 519782
Accepted
exit_status
exit_status
Asked: 2019-05-20 02:34:24 +0800 CST2019-05-20 02:34:24 +0800 CST 2019-05-20 02:34:24 +0800 CST

É seguro redirecionar stdout e stderr para o mesmo arquivo sem cópias do descritor de arquivo?

  • 772

Eu começo no diretório vazio.

$ touch aFile
$ ls
aFile

Então eu lsdois argumentos, um dos quais não está neste diretório. Redireciono os dois fluxos de saída para um arquivo chamado output. Eu uso >>para evitar escrever simultaneamente.

$ ls aFile not_exist >>output 2>>output
$ cat output
ls: cannot access 'not_exist': No such file or directory
aFile

O que parece funcionar. Há algum perigo para esta abordagem?

io-redirection stdout
  • 3 3 respostas
  • 2491 Views

3 respostas

  • Voted
  1. Kusalananda
    2019-05-20T03:17:04+08:002019-05-20T03:17:04+08:00

    O que acontece quando você faz

    some_command >>file 2>>file
    

    é que fileserá aberto para anexar duas vezes. Isso é seguro em um sistema de arquivos POSIX. Qualquer gravação que ocorra no arquivo quando ele for aberto para anexação ocorrerá no final do arquivo, independentemente de os dados virem do fluxo de saída padrão ou do fluxo de erro padrão.

    Isso depende do suporte para operações de gravação de acréscimo atômico no sistema de arquivos subjacente. Alguns sistemas de arquivos, como o NFS, não suportam anexos atômicos. Veja, por exemplo, a pergunta "O anexo de arquivo é atômico no UNIX?" no StackOverflow.

    Usando

    some_command >>file 2>&1
    

    funcionaria mesmo em NFS embora.

    No entanto, usando

    some_command >file 2>file
    

    não é seguro, pois o shell truncará o arquivo de saída (duas vezes) e qualquer gravação que ocorra em qualquer fluxo substituirá os dados já gravados pelo outro fluxo.

    Exemplo:

    $ { echo hello; echo abc >&2; } >file 2>file
    $ cat file
    abc
    o
    

    A hellostring é gravada primeiro (com uma nova linha final) e, em seguida, a string abcseguida por uma nova linha é gravada a partir do erro padrão, substituindo o arquivo hell. O resultado é a string abccom uma nova linha, seguida pelo que resta da primeira echosaída, uma oe uma nova linha.

    Trocar os dois echoao redor produz apenas hellono arquivo de saída, pois essa string é escrita por último e é mais longa que a abcstring. A ordem em que os redirecionamentos ocorrem não importa.

    Seria melhor e mais seguro usar a linguagem mais idiomática

    some_command >file 2>&1
    
    • 22
  2. Best Answer
    mosvy
    2019-05-20T08:43:58+08:002019-05-20T08:43:58+08:00

    Não, não é tão seguro quanto o padrão >>bar 2>&1.

    Quando você está escrevendo

    foo >>bar 2>>bar
    

    você está abrindo o bararquivo duas vezes com O_APPEND, criando dois objetos de arquivo completamente independentes[1], cada um com seu próprio estado (ponteiro, modos abertos, etc).

    Isso é muito diferente 2>&1do que é apenas chamar a chamada do dup(2)sistema e torna os aliases intercambiáveis ​​stderr e stdout para o mesmo objeto de arquivo.

    Agora, há um problema com isso:

    O_APPENDpode levar a arquivos corrompidos em sistemas de arquivos NFS se mais de um processo anexar dados a um arquivo de uma só vez. Isso ocorre porque o NFS não suporta anexar a um arquivo, portanto, o kernel do cliente precisa simulá-lo, o que não pode ser feito sem uma condição de corrida.

    barGeralmente, você pode contar com a probabilidade do arquivo foo >>bar 2>&1ser gravado ao mesmo tempo em dois locais separados, sendo bastante baixa. Mas pelo seu >>bar 2>>barvocê acabou de aumentar em uma dúzia de ordens de grandeza, sem qualquer razão.

    [1] "Abrir descrições de arquivos" na linguagem POSIX.

    • 22
  3. Angel
    2019-05-20T03:06:01+08:002019-05-20T03:06:01+08:00

    Depende do que você quer alcançar. Cabe a você decidir se está tudo bem ter erros no mesmo arquivo que a saída. Isso é apenas salvar texto em um arquivo com a funcionalidade do shell que permite redirecionar como desejar. Não existe um sim ou não absoluto. Como tudo no Linux pode ser feito de várias maneiras, esta é a minha maneira ls notExistingFile existingFile >> output 2>&1 de responder à pergunta: Em termos de redirecionamento em si, sim é perfeitamente seguro.

    • 0

relate perguntas

  • Como dividir uma saída em dois arquivos com grep?

  • Como salvar uma saída do airodump-ng em um arquivo?

  • daqui a algum tempo faça algo (e talvez também mostre o resultado no console)

  • Ecoar algo em segundo plano, mas vê-lo mesmo se você reiniciou ou teve um corte de energia?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve