Есть ли способ заставить рыбную оболочку использовать функцию printf GNU coreutils?

Возникла проблема при запуске следующей команды в оболочке fish:

❯ printf '%q\n' 'André Previn & London Symphony Orchestra'
%q: invalid conversion specification

Сначала я не осознавал, что fish на самом деле имеет свою собственную функцию printf, которая ведет себя во многом так же, как функция GNU coreutilsprintf, но не поддерживает директиву q, как GNU coreutilsprintf.

fish-shell документы:

https://fishshell.com/docs/current/cmds/printf.html#format-specifiers

GNU coreutilsprintf документы:

https://www.gnu.org/software/coreutils/manual/html_node/printf-invocation.html#printf-invocacy

Есть ли способ сообщить fish-shell, что я хочу, чтобы он использовал функцию GNU coreutilsprintf вместо настраиваемой функции 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

Как насчет вызова его по абсолютному пути?

user1934428 22.08.2024 12:05

Не знаю, что вы имеете в виду. GNU coreutils printf является встроенной функцией, поэтому я не уверен, что существует абсолютный путь, на который я могу ссылаться — в моем случае я думаю, что он заранее встроен в оболочку zsh

Drew Daniels 22.08.2024 14:26

Coreutils по определению представляют собой набор утилит, поэтому идея встроенных функций бессмысленна. Итак, вы хотите запустить встроенную функцию printf из вашего zsh? В этом случае создайте оболочку zsh, которая просто вызывает встроенную функцию printf и передает ей все свои параметры.

user1934428 22.08.2024 15:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Стандартная идиома, позволяющая избегать встроенных команд оболочки, — использовать env. Т.е. env printf ...

Когда я запускаю env printf '%q\n' 'test' в оболочке fish, я получаю следующее сообщение об ошибке: printf: illegal format character

Drew Daniels 22.08.2024 14:21

У меня работает с рыбой 3.7.0?

pixelbeat 22.08.2024 21:50

Я в эфире fish, version 3.7.1

Drew Daniels 24.08.2024 17:07
Ответ принят как подходящий

Когда вы запускаете неквалифицированный 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.

Другие вопросы по теме

Экономия $! (идентификатор процесса последней фоновой команды) как элемент массива
Zsh glob для поиска пустых каталогов или содержащих только .DS_Store
Zsh: совпадений не найдено: MulticateLists(np.array([1,3,5,6,4,6,7,1,2,7]))
Как использовать пользовательскую функцию предварительного просмотра для команды fzf в zsh
Gawk зависает при использовании регулярного выражения для RS в сочетании с чтением непрерывного потока со стандартного ввода
Zsh-скрипт, использующий отформатированную строку даты в команде FFMPEG
Zsh — Как присвоить переменной строку miltiline json с подставленными значениями
Когда я запускаю поэтическую оболочку на MacOS с оболочкой ZSH, выдает ошибку «команда не найдена»
Расширение скобок zsh для аргумента, содержащего пробелы, полученные из переменной
Как мне выйти из вложенных оболочек в командной строке, не закрывая/выходя из терминала случайно?