Как интерполировать $ {: – = cat} в строке с двумя кавычками?

(В следующем cat – резерв для «любой команды в $PATH ».)

Рассмотрим этот пример:

 % TMP=${:-=cat} % FOO="blah blah blah $TMP blah blah blah" % echo $FOO blah blah blah /bin/cat blah blah blah 

Прямая интерполяция ${:-=cat} в строку не дает того же:

 % FOO="blah blah blah ${:-=cat} blah blah blah" % echo $FOO blah blah blah =cat blah blah blah 

Есть ли способ достичь того же конечного результата, что и раньше (т. Е. С /bin/cat а не =cat в финальной строке) без необходимости создания промежуточной переменной TMP ?

(Разумеется, единственная причина даже рассматривать конструкцию типа ${:-=cat} вместо plain-ol ' =cat – это надежда на возможность интерполировать ее в строке. Я был удивлен, обнаружив, что это не так, т работы …)

One Solution collect form web for “Как интерполировать $ {: – = cat} в строке с двумя кавычками?”

В zsh , = в форме =word является специальным оператором расширения и будет расширен до полного пути команды с именем word если команда существует, и EQUALS опция EQUALS .

Это расширение не выполняется внутри двойных кавычек, поэтому использование двойных кавычек ${:-=cat} не будет работать:

 $ TMP="${:-=cat}" $ print -rl -- $TMP =cat 

Теперь у вас есть несколько вариантов для достижения того же, что вы хотите.

Не используйте двойные кавычки вокруг него:

 $ FOO="blah blah blah "${:-=cat}" blah blah blah" $ print -rl -- $FOO blah blah blah /bin/cat blah blah blah 

Модуль zsh/parameter предоставляет commands ассоциативный массив, предоставляя вам доступ к хэш-таблице команд. Вы можете использовать $commands[name] чтобы получить полный путь к команде name :

 $ zmodload zsh/parameter $ print -rl -- $commands[cat] /bin/cat 

Другой вариант – использовать модификатор : :c :

 $ var=cat $ print -rl -- $var:c /bin/cat $ print -rl "foo ${${:-cat}:c} bar" foo /bin/cat bar 

Конечно, вы также можете использовать стандартную command -v :

 $ print -rl -- "foo $(command -v cat) bar" foo /bin/cat bar 
  • При использовании zsh вызывает расширение истории
  • Как отслеживать разбор и расширение параметров?
  • Как настроить .zshrc для specfic os
  • Отдельный путь для файлов .zcompdump
  • Есть ли встроенный (или, по крайней мере, простой) способ проверить наличие функции, доступной через $ FPATH?
  • Есть ли postexec / predisplay hook для ZSH?
  • Обнаружить, когда Zsh запущен в подоболочке другой оболочки
  • FPATH в zsh: функции и функции сайта
  • Что делает% \ / do (расширение командной строки zsh)?
  • подсветка синтаксиса zsh для файлов
  • Получить полный путь к текущему загрузочному файлу zsh (например, zshrc или zshenv)
  • Linux и Unix - лучшая ОС в мире.