Возникла проблема при запуске следующей команды в оболочке fish
:
❯ printf '%q\n' 'André Previn & London Symphony Orchestra'
%q: invalid conversion specification
Сначала я не осознавал, что fish
на самом деле имеет свою собственную функцию printf
, которая ведет себя во многом так же, как функция GNU coreutils
printf
, но не поддерживает директиву q
, как GNU coreutils
printf
.
fish-shell
документы:
https://fishshell.com/docs/current/cmds/printf.html#format-specifiers
GNU coreutils
printf
документы:
https://www.gnu.org/software/coreutils/manual/html_node/printf-invocation.html#printf-invocacy
Есть ли способ сообщить fish-shell
, что я хочу, чтобы он использовал функцию GNU coreutils
printf
вместо настраиваемой функции printf
?
[Редактировать 1]: я не осознавал, что MacOS имеет свои собственные встроенные функции, производные от BSD, которые она использует, а не встроенные функции GNU coreutils. Я по-прежнему могу использовать опцию q
в zsh
, но не в fish
при выполнении следующих команд:
# in zsh
❯ printf '%q\n' 'test'
test
# fish, run in a zsh shell
❯ builtin printf '%q\n' 'test'
%q: invalid conversion specification
❯ command printf '%q\n' 'test'
printf: illegal format character q
Не знаю, что вы имеете в виду. GNU coreutils printf
является встроенной функцией, поэтому я не уверен, что существует абсолютный путь, на который я могу ссылаться — в моем случае я думаю, что он заранее встроен в оболочку zsh
Coreutils по определению представляют собой набор утилит, поэтому идея встроенных функций бессмысленна. Итак, вы хотите запустить встроенную функцию printf
из вашего zsh? В этом случае создайте оболочку zsh, которая просто вызывает встроенную функцию printf и передает ей все свои параметры.
Для этого можно использовать escape-символ
https://github.com/fish-shell/fish-shell/issues/10678#issuecomment-2303446296
Стандартная идиома, позволяющая избегать встроенных команд оболочки, — использовать env
.
Т.е. env printf ...
Когда я запускаю env printf '%q\n' 'test'
в оболочке fish
, я получаю следующее сообщение об ошибке: printf: illegal format character
У меня работает с рыбой 3.7.0?
Я в эфире fish, version 3.7.1
Когда вы запускаете неквалифицированный printf
в fish, bash или zsh, он запускает встроенную версию printf данной оболочки.
В вашей системе есть исполняемый файл printf
, вероятно, в /usr/bin/printf или аналогичном.
Чтобы запустить это, вы можете использовать command printf
в рыбе или, например. env printf
(что также будет работать в bash).
Однако, поскольку вы используете macOS, это не версия GNU coreutils, а собственная версия macOS, основанная на BSD.
А поскольку %q
является расширением GNU, у него его не будет, и его запуск вам на самом деле не поможет.
Вы можете запустить, например. встроенный в bash printf, запустив bash:
bash -c 'printf "%q\n" "$@"' printf 'echo $(hahaha)'
(этот второй «printf» сообщает bash вызвать этот процесс «printf» — он использует его как argv0, $0
)
В printf рыбы нет %q
, а если бы она была, то для рыбы выполнялось бы экранирование, а не bash/zsh/sh — правила цитирования другие. Вместо этого есть string escape
.
Как насчет вызова его по абсолютному пути?