Minha resposta no StackOverflow, que recebeu pelo menos dois votos positivos, é o que funcionou no shell de uma estação de trabalho que usei em meu local de trabalho anterior. Nessa estação de trabalho, que provavelmente é uma versão antiga do SunOS ou Red Hat Commercial Linux ou Red Hat Enterprise Linux, testa a existência de um arquivo regular e um diretório gravável. , , , e eram os únicos shells possíveis instalados naquela estação de trabalho, e provavelmente o executei em .[[ -fwd
path
]]
path
sh
bash
csh
tcsh
zsh
bash
Estou fazendo esta pergunta porque não consegui reproduzir isso agora em outros sistemas operacionais semelhantes ao Unix. Sempre me dá um erro de sintaxe , então estou começando a duvidar se alguma vez o executei com sucesso.
Minha pergunta é: em quais sistemas esse código é válido e, em caso afirmativo, isso é um bug ou um recurso?
Não, isso não funciona. Na verdade, não em nenhuma versão do bash.
Este teste funciona em qualquer versão do bash (na verdade, em qualquer shell):
Mas o que está testando não é um sinalizador de arquivo, está testando se a string
-fwd
tem comprimento 0 ou não. Como tem alguns personagens, o teste é verdadeiro.Usando
[[
altere quais sinalizadores são permitidos:Dá o erro acima no bash até o bash 3.2.
Não há erro para versões bash após 3.2, mas o resultado é verdadeiro:
o que é impossível: uma entrada de diretório não pode ser um arquivo (
-f
) e um diretório (-d
).Isso confirma a ideia de que o teste está realmente testando a string:
Testando com um arquivo
Dá uma mensagem de falha nas versões bash após 3.2.
Para outras versões, dá uma resposta verdadeira (o que é impossível para testes de arquivo, uma entrada de diretório não pode ser ao mesmo tempo um arquivo e um diretório).
Comparando esses dois testes, parece que apenas a primeira letra é usada:
Provavelmente um bug corrigido no bash 4
Falha também em:
csh
[[: No match.
tcsh
[[: Command not found.
zsh
unknown condition: -fd
# Versão 5.4.2ksh
syntax error at line 3:
wds' inesperado` # Versão AJM 93u+ 2012-08-01