Estou executando este script zsh, mas recebo a seguinte mensagem de erro:
./executable: unrecognized modifier `P'
O código do script é o seguinte:
#!/bin/zsh
setopt no_unset err_exit pipe_fail
if [[ $# -lt 2 ]]; then
cat <<EOF
Usage: ${0:t} something1 something2 ..
EOF
exit 1
fi
foobar=${argv[1]:P}
Entendo que esse erro tem a ver com a atribuição foobar, mas não consigo encontrar nenhum lugar onde isso P
seja usado, nem por que é útil. Alguma ideia?
Responder1
Possivelmente tente substituir por
foobar=$(readlink -f ${argv[1]})
Isso só funcionará se o arquivo existir, o que :P não exige.
Responder2
O :P
modificador foi adicionado no Zshversão 5.3e, portanto, não estará disponível em versões mais antigas. Uma abordagem semelhante, mas não exatamente idêntica, seriause o :A
modificador em vez disso.
De zshexpn(1)
:
Modificador:a
Transforme um nome de arquivo em um caminho absoluto: acrescenta o diretório atual, se necessário; remover '.' segmentos de caminho; e remova os segmentos de caminho '..' e os segmentos que os precedem imediatamente.
Modificador:A
Transforme um nome de arquivo em um caminho absoluto como faz o modificador 'a' e, em seguida, passe o resultado pela função da biblioteca realpath(3) para resolver links simbólicos.
Nota: em sistemas que não possuem uma função de biblioteca realpath(3), os links simbólicos não são resolvidos, portanto nesses sistemas 'a' e 'A' são equivalentes.
Nota: foo:A e realpath(foo) são diferentes em algumas entradas. Para semântica realpath(foo), consulte o
P
modificador.
Modificador:P
Transforme um nome de arquivo em um caminho absoluto, como realpath(3). O caminho resultante será absoluto, não terá nenhum '.' nem componentes '..' e referem-se à mesma entrada de diretório que o nome do arquivo de entrada.
Ao contrário do realpath(3), componentes finais inexistentes são permitidos e preservados.
Omiti alguns dos detalhes mais estranhos, portanto, verifique a página de manual; a seção "Expansão do histórico", subseção "Modificadores".