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

У меня есть несколько скриптов /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?
  • echo результат из подоболочки в zsh
  • Сделать zsh использовать readline вместо zle?
  • Переход к началу действия вставки в режиме vi оболочки VI
  • Завершение Zsh для монтирования (/ run / media / DISK-LABEL)?
  • Vim и унифицированные разности
  • Запуск одной команды за другой в zsh при нажатии Ctrl-C
  • ZSH% m prompt escape не работает, как описано в Debian Linux
  • Является ли «Арифметическое расширение» ожидаемым действием на vars внутри `[[` tests?
  • zsh: исключение файлов из шаблона
  • Interesting Posts

    Как преобразовать XML-файл в CSV с помощью Perl?

    Как установить ссылку на оригинальный каталог, связав ссылку с этим каталогом?

    Как эффективно использовать SVN CLI

    Есть ли обратный поиск команды в vim?

    Удаленный запуск LXDE через SSH

    Есть ли одна страница документации для всех переменных среды XDG_ *?

    какое имя устройства я должен предоставить в snd_pcm_open, кроме "default"

    установить библиотеки X11 и файлы заголовков в учетной записи пользователя centOS

    Может ли apt обновлять установленные вручную пакеты

    unix: заменить один полный столбец в одном файле одним значением из другого файла

    Как контролировать кластер Pacemaker с помощью скрипта?

    Пакеты файлов Windows неуправляемы в файловом браузере Linux

    Как установить Ralink RT5390 в режим N с помощью iw?

    «Обновляет» zip-файл с опцией -FS изменяет время модификации файла?

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

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