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 / 742050
Accepted
Binarus
Binarus
Asked: 2023-04-06 00:05:32 +0800 CST2023-04-06 00:05:32 +0800 CST 2023-04-06 00:05:32 +0800 CST

Em >&N, por que N é tratado como descritor de arquivo em vez de nome de arquivo (como o manual parece dizer)?

  • 772

Estou lutando para entender o redirecionamento de IO no bash. Eu vi muitos exemplos como o seguinte (que é literalmente retirado da resposta aceita aqui ):

exec 3<> /tmp/foo  #open fd 3.
echo "test" >&3
exec 3>&- #close fd 3.

Não entendi a segunda linha. Para ser preciso, não entendo como seu comportamento está de acordo com o manual do bash.

Obviamente, na segunda linha, >&3deve redirecionar stdout(e possivelmente stderr- não sei) para o descritor de arquivo 3; todo o resto não faria sentido.

Mas do manual atual do bash (no momento em que escrevo), seção 3.6.4 (formatando o meu):

Essa construção permite que tanto a saída padrão (descritor de arquivo 1) quanto a saída de erro padrão (descritor de arquivo 2) sejam redirecionadas para o arquivo cujo nome é a expansão de word. Existem dois formatos para redirecionar a saída padrão e o erro padrão:
&>worde>&word

[ Em seguida, explica diferenças sutis entre o primeiro e o segundo formato, mas vamos deixar isso de lado por um momento porque não é importante para a pergunta. ]

No meu entendimento, isso diz que >&3redireciona stderre stdoutpara um arquivo cujo nome é 3, que é bem diferente de redirecionar stdout(e possivelmente stderr) para descritor de arquivo 3.

Alguém poderia explicar o que estou perdendo?

bash
  • 1 1 respostas
  • 726 Views

1 respostas

  • Voted
  1. Best Answer
    terdon
    2023-04-06T00:21:53+08:002023-04-06T00:21:53+08:00

    Na verdade, é precisamente a parte que você deixa de lado que é mais relevante (da documentação do GNU bash ):

    3.6.4 Redirecionando Saída Padrão e Erro Padrão

    Essa construção permite que tanto a saída padrão (descritor de arquivo 1) quanto a saída de erro padrão (descritor de arquivo 2) sejam redirecionadas para o arquivo cujo nome é a expansão de word.

    Existem dois formatos para redirecionar a saída padrão e o erro padrão:

    &>word 
    

    e

    >&word 
    

    Das duas formas, a primeira é a preferida. Isso é semanticamente equivalente a

    >word 2>&1 
    

    Ao usar a segunda forma, a palavra não pode se expandir para um número ou '-'. Em caso afirmativo, outros operadores de redirecionamento se aplicam (consulte Duplicando descritores de arquivo abaixo) por motivos de compatibilidade.

    Essa nota final é a parte mais importante, então vou repeti-la aqui:

    Ao usar a segunda forma, a palavra não pode se expandir para um número ou '-'. Em caso afirmativo, outros operadores de redirecionamento se aplicam (consulte Duplicando descritores de arquivo abaixo) por motivos de compatibilidade.

    Portanto, se wordexpande para um número ou -, regras especiais são acionadas. As strings se expandem para si mesmas, portanto, 3pode-se dizer que "expandem", o 3que significa que >&3são tratadas de acordo com as regras descritas na seção Duplicando Descritores de Arquivos :

    O operador de redirecionamento

    [n]<&word 
    

    é usado para duplicar descritores de arquivo de entrada. Se a palavra se expandir para um ou mais dígitos, o descritor de arquivo indicado por n será uma cópia desse descritor de arquivo. Se os dígitos na palavra não especificarem um descritor de arquivo aberto para entrada, ocorrerá um erro de redirecionamento. Se a palavra for avaliada como '-', o descritor de arquivo n será fechado. Se n não for especificado, a entrada padrão (descritor de arquivo 0) será usada.

    O operador

    [n]>&word 
    

    é usado de forma semelhante para duplicar os descritores de arquivo de saída. Se n não for especificado, a saída padrão (descritor de arquivo 1) será usada. Se os dígitos na palavra não especificarem um descritor de arquivo aberto para saída, ocorrerá um erro de redirecionamento. Se a palavra for avaliada como '-', o descritor de arquivo n será fechado. Como um caso especial, se n for omitido e a palavra não se expandir para um ou mais dígitos ou '-', a saída padrão e o erro padrão serão redirecionados conforme descrito anteriormente.

    Tudo isso para dizer que, no caso específico em que o que vem depois do >&é um número, esse número é considerado um descritor de arquivo. Presumivelmente, é exatamente por isso que o manual afirma que &>wordé preferível ao equivalente, >&wordpois &>wordé inequívoco.

    • 16

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

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