Intereting Posts
виртуальная машина centos не регистрируется на сервере dns интрасети Убивание вторичного диспетчера диспетчера сортировки Xorg Автоматическое подключение USB-дисков (как это работает) Как извлекать значения из файла с помощью шаблонов из столбца в другом файле и вставлять их в новый столбец? Как установить Steam на элементарной ОС Loki 64-bit Как сбрасывать SSHD-процесс и искать строки Строка Shell Concat из файла конфигурации Почему мой elif рассматривается как выражение else в моем сценарии bash? Сделать программный рейд ядра использовать выделенное ядро ​​процессора Список всех файлов, содержащих определенную строку. Можно ли найти время прошлых сеансов пользователя? Отключить удаленные узлы на сервере uTorrent (utserver) Редактирование / etc / hosts и / etc / sysconfig / network не изменяет имя хоста ОШИБКА: Не удалось создать собственное расширение gem на Arch (postgresql) Настройка ipaddress с помощью systemd-networkd без ссылки

Как интерполировать $ {: – = 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 – это надежда на возможность интерполировать ее в строке. Я был удивлен, обнаружив, что это не так, т работы …)

В 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