В zsh ${$(pwd)} выводит текущий каталог. Однако, если я запускаю echo ${/path/to/somewhere} , он просто показывает пустую строку. Почему это происходит? Спасибо!
1 ответ
Я полагаю, вы говорите о print ${$(pwd)} или что-то в этом роде, верно ?!
Расширение ${$(pwd)} в текущий рабочий каталог является ожидаемым поведением, хотя на первый взгляд это может показаться странным. Не дайте себя одурачить, думая, что подстановка команд $(pwd) вычисляется первой, а результат используется как имя переменной... нет, он используется как значение переменной, как объясняет man zshexpn :
${name}Подставляется значение имени параметра, если оно есть.(...) Если вместо
${...}выше используется выражение параметра типа$(...)или подстановка команды типаname, оно сначала раскрывается, а результат используется так, как если бы это было значениеname. (...) Форма с$(...)часто полезна в сочетании с флагами, описанными ниже; см. примеры ниже.(...) Флаг f полезен для разбиения двойных кавычек подстановки построчно. Например,
${(f)"$(<file)"}подставляет содержимое файла, разделенного таким образом, что каждая строка является элементом результирующего массива.
К вашему второму примеру. Я думаю, что это шаблон замены синтаксиса:
${name/pattern/repl}Заменить самое длинное из возможных совпадений pattern в раскрытии имени параметра на строку repl. (...)
Сначала посмотрите этот пример:
$ foo=hello
$ print ${foo/hello/good/bye}
good/bye
Если вы опустите foo вы скажете zsh выполнить поиск и заменить переменную ${} , которая пуста:
$ print ${}
$
- следовательно, ${/something/foo/bar} возвращает пустую строку.
