
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:
- Corre
date 2
, que não é uma invocação válidadate
e 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 $0
e executar esse código de forma não destrutiva, invocando o Bash com a -c
opção: bash -c "$(<test.bash)" output-file
colocará 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:
O
date
comando é executado com argumento2
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. Comobash
extensã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
.Depois que o arquivo de script for substituído, ele não será mais um script válido e
bash
reclamará dos comandos malformados.
Diferença entre bash
shells POSIX
Com um shell POSIX simples, como o dash
, o atalho &>
não é compatível. Portanto, o comando date 2&>$0
irá redirecionarapenasstdout para o arquivo $0
. Neste caso, isso significa que o arquivo de script será substituído por um arquivo vazio enquanto a date
mensagem de erro aparecerá no terminal.