Ich führe dieses Zsh-Skript aus, erhalte jedoch die folgende Fehlermeldung:
./executable: unrecognized modifier `P'
Der Code des Skripts lautet wie folgt:
#!/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}
Ich verstehe, dass dieser Fehler mit der Foobar-Zuweisung zusammenhängt, kann aber nirgends finden, wo diese P
verwendet wird oder warum sie nützlich ist. Irgendwelche Ideen?
Antwort1
Versuchen Sie es eventuell mit
foobar=$(readlink -f ${argv[1]})
Das funktioniert nur, wenn die Datei existiert, was :P jedoch nicht erforderlich ist.
Antwort2
Der :P
Modifikator wurde in Zsh hinzugefügtVersion 5.3und ist daher in älteren Versionen nicht verfügbar. Ein ähnlicher, aber nicht ganz identischer Ansatz wäre,:A
verwenden Sie stattdessen den Modifikator.
Aus zshexpn(1)
:
Modifikator:a
Wandelt einen Dateinamen in einen absoluten Pfad um: stellt bei Bedarf das aktuelle Verzeichnis voran; entfernt „.“-Pfadsegmente; und entfernt „..“-Pfadsegmente und die Segmente, die ihnen unmittelbar vorangehen.
Modifikator:A
Wandeln Sie einen Dateinamen in einen absoluten Pfad um, wie es der Modifikator „a“ tut, und übergeben Sie das Ergebnis dann an die Bibliotheksfunktion realpath(3), um symbolische Links aufzulösen.
Hinweis: Auf Systemen ohne die Bibliotheksfunktion realpath(3) werden symbolische Links nicht aufgelöst, daher sind auf diesen Systemen „a“ und „A“ gleichwertig.
Hinweis: foo:A und realpath(foo) unterscheiden sich bei einigen Eingaben. Informationen zur Semantik von realpath(foo) finden Sie beim
P
Modifikator.
Modifikator:P
Wandelt einen Dateinamen in einen absoluten Pfad um, wie realpath(3). Der resultierende Pfad ist absolut, hat weder '.'- noch '..'-Komponenten und verweist auf denselben Verzeichniseintrag wie der eingegebene Dateiname.
Im Gegensatz zu realpath(3) sind nicht vorhandene nachstehende Komponenten zulässig und werden beibehalten.
Ich habe einige der eher irrelevanten Details weggelassen. Lesen Sie daher unbedingt die Manpage im Abschnitt „History Expansion“, Unterabschnitt „Modifiers“.