O que `data 2&>$0` faz?

O que `data 2&>$0` faz?

Estou olhando o código shell de um colega de trabalho e vi o seguinte:

date 2&>$0

Eu sei qual é a data, mas o que 2&>$0 está fazendo? Ele está fora por um tempo, então não posso perguntar sobre o que era essa parte.

Responder1

Supondo que o código que você postou esteja correto, o que ele faz é muito estranho. Isto:

  • Corredate 2, que não é uma invocação válida datee que produzirá uma mensagem de erro, então
  • Redireciona tanto a saída padrão quanto o erro padrãocom&>,
  • No arquivo que contém o script em execução ($0), apagando seu conteúdo existente.

Como o modo como o Bash lê o script é pegar uma linha por vez do arquivo, isso resulta na obtenção de um absurdo do arquivo sobrescrito e provavelmente na saída (porque o arquivo foi truncado para um tamanho menor que o ponto em que esta linha apareceu) ou dando um erro de sintaxe (se o original for muito curto e parte do erro for lida na próxima linha).

Não consigo pensar em um único uso legítimo para essa linha, mas como você disse que a forneceu exatamente como está escrita, é isso que ela faz.


A rigor, é possível atribuir outro valor $0e executar esse código de forma não destrutiva, invocando o Bash com a -copção: bash -c "$(<test.bash)" output-filecolocará a mensagem de erro em output-file, mas é totalmente perverso fazer isso.

Responder2

Resumo

Em bash, se esse comando estiver em um script, o arquivo de script será substituído por uma mensagem de erro.

Exemplo

Considere o roteiro:

$ cat test.sh
date 2&>$0

Agora, execute o script:

$ bash test.sh
test.sh: line 2: unexpected EOF while looking for matching ``'
test.sh: line 3: syntax error: unexpected end of file

Observe o novo conteúdo do script:

$ cat test.sh
date: invalid date `2'

Explicação

O comando, date 2&>$0, é interpretado da seguinte forma:

  1. O datecomando é executado com argumento2

  2. Toda a saída, tanto stdout quanto stderr, do comando date é redirecionada para o arquivo $0. $0é o nome do script atual.

    O símbolo >indica o redirecionamento de, por padrão, stdout. Como bashextensão, o símbolo &>é um redirecionamento de indicação de atalho deambosstdout e stderr. Conseqüentemente, tanto stdout quanto stderr são redirecionados para o arquivo $0.

  3. Depois que o arquivo de script for substituído, ele não será mais um script válido e bashreclamará dos comandos malformados.

Diferença entre bashshells POSIX

Com um shell POSIX simples, como o dash, o atalho &>não é compatível. Portanto, o comando date 2&>$0irá redirecionarapenasstdout para o arquivo $0. Neste caso, isso significa que o arquivo de script será substituído por um arquivo vazio enquanto a datemensagem de erro aparecerá no terminal.

informação relacionada