В 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}
возвращает пустую строку.