Как интерполировать $ {: – = 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`
  • Как избежать разбора файлов / etc / *
  • zsh находится в / usr / bin, но также в / bin, в чем разница?
  • Когда необходимо включить `emulate -LR zsh` в функцию, вызванную zsh-виджетами?
  • Глобус с помощью скобок и переменных в zsh
  • Как сделать короткие строки sh
  • Что вызывает это поведение при определении функции с именем ':'
  • Сделать zsh alt-f вести себя как emacs alt-f
  • Как перечислить все стили в zsh
  • В zsh, как я могу сбросить всю конфигурацию?
  • Interesting Posts

    Как получить pid подпроцесса из самого подпроцесса

    Как восстановить карту памяти в ее исходное состояние, поскольку она показывает двойной размер, когда я пытаюсь разбить его в fdisk?

    KDE 5 из Debian Jessie – какая версия Qt была использована для ее компиляции?

    Как войти в единый хост SSH без кодовой фразы?

    Почему оболочки выполняют собственные команды «эхо» внутри?

    Термин gnome – это тип оболочки без входа?

    iptables для получения публичного ip на 2-м интерфейсе виртуального окна

    Bash, когда мой домашний каталог является символической ссылкой

    Чтение столбцов из файла в отдельные переменные

    Как понизиться от растяжения до Джесси

    Как запустить ssh -t user @ remote 'sudo nohup bash -c "команда" в фоновом режиме

    Место на диске полностью не изменяется после установки папки на другом диске

    Включить BFQ в Fedora

    Как импортировать официальные ключи Tor GPG?

    bash regex не распознает все группы

    Linux и Unix - лучшая ОС в мире.