Я запускаю этот скрипт 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 используется, и почему он не полезен. Есть идеи?

2 ответа2

0

Модификатор :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), несуществующие конечные компоненты разрешены и сохранены.

Я пропустил некоторые из более посторонних деталей, поэтому обязательно ознакомьтесь со справочной страницей; раздел "Расширение истории", подраздел "Модификаторы".

0

Возможно, попробуйте заменить на

foobar=$(readlink -f ${argv[1]})

Это будет работать только в том случае, если файл существует, чего:P не требует.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .