Я запускаю этот скрипт zsh, но получаю следующее сообщение об ошибке:
./executable: unrecognized modifier `P'
Код скрипта следующий:
#!/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}
Я понимаю, что эта ошибка связана с назначением foobar, но я не могу найти нигде, где это P
используется, или почему это полезно. Есть идеи?
решение1
Возможно, попробуйте заменить на
foobar=$(readlink -f ${argv[1]})
Это сработает только в том случае, если файл существует, что :P не требуется.
решение2
Модификатор :P
был добавлен в Zshверсия 5.3, и, таким образом, будет недоступен в более старых версиях. Похожий, но не совсем идентичный подход будет заключаться виспользуйте :A
вместо этого модификатор.
От zshexpn(1)
:
Модификатор:a
Преобразует имя файла в абсолютный путь: добавляет текущий каталог, если необходимо; удаляет сегменты пути «.»; удаляет сегменты пути «..» и сегменты, которые непосредственно им предшествуют.
Модификатор:A
Преобразуйте имя файла в абсолютный путь, как это делает модификатор «a», а затем передайте результат через библиотечную функцию realpath(3) для разрешения символических ссылок.
Примечание: в системах, в которых отсутствует библиотечная функция realpath(3), символические ссылки не разрешаются, поэтому в этих системах «a» и «A» эквивалентны.
Примечание: foo:A и realpath(foo) различаются на некоторых входах. Для семантики realpath(foo) см. модификатор
P
.
Модификатор:P
Превратите имя файла в абсолютный путь, например realpath(3). Результирующий путь будет абсолютным, не будет содержать ни '.', ни '..' и будет ссылаться на ту же запись каталога, что и входное имя файла.
В отличие от realpath(3), несуществующие конечные компоненты разрешены и сохраняются.
Я опустил некоторые незначительные детали, поэтому обязательно проверьте страницу руководства: раздел «Расширение истории», подраздел «Модификаторы».