Принуждение к расширению глобального псевдонима частью слова

У меня есть несколько скриптов /tmp/foo/bar.sh и /tmp/foo/baz.sh , выглядят так:

 # /tmp/foo/bar.sh alias -g __FILE__='${(%):-%x}' alias -g __DIR__='${${(%):-%x}%/*}' printf "sourcing %s\n" __FILE__ printf "about to source %s/baz.sh\n" __DIR__ . /tmp/foo/baz.sh . $( printf "%s/baz.sh" __DIR__ ) # succeeds . __DIR__"/baz.sh" # fails 
 # /tmp/foo/baz.sh printf "sourcing %s\n" __FILE__ 

Первый скрипт /tmp/foo/bar.sh определяет пару глобальных ( -g ) псевдонимов как заклинания, которые должны расширяться ( в первом приближении !) До пути текущего вызова (вызова) и содержать каталог. Затем он использует эти псевдонимы в качестве аргументов в нескольких командах printf . Наконец, он /tmp/foo/baz.sh второй скрипт /tmp/foo/baz.sh тремя различными способами:

  1. используя литеральный путь ко второму скрипту;
  2. используя псевдоним __DIR__ косвенно, путем замены команды printf ;
  3. используя псевдоним __DIR__ .

Вот что я получаю, когда я запускаю первый скрипт:

 % (/usr/bin/env -i zsh -fc '. /tmp/foo/bar.sh') sourcing /tmp/foo/bar.sh about to source /tmp/foo/baz.sh sourcing /tmp/foo/baz.sh sourcing /tmp/foo/baz.sh /tmp/foo/bar.sh:.:11: no such file or directory: __DIR__/baz.sh 

(Песня и танец с /usr/bin/env – это моя попытка /tmp/foo/bar.sh в качестве barebones среды, насколько это возможно.)

Похоже, что если __DIR__ сразу следует за /baz.sh , то он не распознается как псевдоним, что не является необоснованным. Форма $( printf "%s/baz.sh" __DIR__ ) обойти эту проблему, но ее длина и непрозрачность в значительной степени $( printf "%s/baz.sh" __DIR__ ) от использования псевдонима в первую очередь.

Есть ли более удобный способ создания пути ко второй строке с использованием псевдонима __DIR__ ?

В более общем смысле, существует ли какой-то общий «синтаксический трюк», чтобы предупредить парсер о том, что конкретную последовательность символов следует рассматривать как псевдоним? Моя надежда состоит в том, чтобы сделать такой глобальный псевдоним более похожим на поведение простого (т. Е. Однострочного, без аргументов и т. Д.) Препроцессорного макроса. Примером такого «синтаксического трюка», который я имею в виду, является что-то вроде следующего (ни одно из них не работает):

 . {__DIR__}/baz.sh . __DIR__"/baz.sh" 

2 Solutions collect form web for “Принуждение к расширению глобального псевдонима частью слова”

Есть функция, которая позволяет заменять строку другой строкой только одним дополнительным символом:

 __FILE__='${(%):-%x}' __DIR__='${${(%):-%x}%/*}' . $__DIR__/baz.sh 

Если вы действительно не хотите определять переменную, альтернативой является определение именованного каталога, который расширяется только после тильды в начале слова. Это работает в вашем примере, но может не обобщать все случаи, когда вы этого хотите.

 hash -d __FILE__='${(%):-%x}' hash -d __DIR__='${${(%):-%x}%/*}' . ~__DIR__/baz.sh 

Хорошо, я нашел адекватное решение, проиллюстрированное ниже

 # /tmp/foo/bar.sh alias -g __FILE__='echo "${(%):-%x}"' alias -g __DIR__='echo "${${(%):-%x}%/*}"' printf "sourcing %s\n" $(__FILE__) printf "about to source %s/baz.sh\n" $(__DIR__) . $(__DIR__)/baz.sh # succeeds 
  • Измените zsh-завершение, чтобы выполнить доработки над подсказкой
  • Как я могу сделать свою тему Zsh («fade») хорошо выглядеть в urxvt?
  • Как можно настроить псевдонимы bash для обработки пробелов в именах каталогов?
  • каталог автозаполнения zsh
  • Выполнение скрипта в разрешениях zsh-файла
  • как найти файл, определяющий псевдоним
  • zsh: Что делает команда «время + номер» в zsh
  • Показать путь из корня проекта в ZSH Prompt
  • Как получить полное завершение в диалоговом окне запуска приложения?
  • Как удалить последнюю команду (или текущую команду для бонуса) из истории zsh
  • Как добавить статус батареи в zsh в крайнем правом положении?
  • Linux и Unix - лучшая ОС в мире.