У меня проблемы с получением cd
смены каталога с учетом вывода команды.
Например, следующее не работает:
# should be equivalent to "cd ~"
cd $(echo "~")
# should be equivalent to "cd ~/go"
cd $(echo "~/go")
Оба возвращают ошибку, например
cd: no such file or directory: ~
cd: no such file or directory: ~/go
Однако я могу указать абсолютные пути, например
cd $(echo "/Users/olly")
который успешно изменит каталог на это место. Более того, если я опущу кавычки, это сработает.
cd $(echo ~)
На данный момент у меня есть программа jump-config
, которая печатает строку пути к терминалу.
jump-config
// prints ~/go/src/gitlab.com/ollybritton/jump/jump-config
я пытаюсь сделать
cd $(jump-config)
но я получаю ошибку
cd: no such file or directory: ~/go/src/gitlab.com/ollybritton/jump/jump-config
Я бы с удовольствием сделал cd $JUMP_CONFIG
, однако вывод программы не фиксированный и мне нужно cd $(jump-config)
изменить.
Я ценю любое объяснение проблемы или помощь заранее.
Чтобы объяснить Зачем, он работает, если вы выдаете кавычки, кстати - в этом случае echo
не выдает ~
, он выдает /Users/olly
(потому что оболочка заменяет ~
на /Users/olly
еще до того, как echo
запустится).
(тьфу, с/испустить/опустить/)
Расширение тильды не работает в кавычках, и его обычно следует избегать в сценариях. Он предназначен только для интерактивного использования. От man bash
, / *Tilde Expansion
:
If a word begins with an unquoted tilde character (`~'), all of the characters preceding the first unquoted slash (or all characters, if there is no unquoted slash) are considered a tilde-prefix. If none of the characters in the tilde-prefix are quoted, the characters in the tilde-prefix following the tilde are treated as a possible login name. If this login name is the null string, the tilde is replaced with the value of the shell parameter HOME. If HOME is unset, the home directory of the user executing the shell is substituted instead. Otherwise, the tilde-prefix is replaced with the home directory associated with the specified login name.
Можно ли изменить jump-config
для вывода $HOME
вместо ~
? Если нет, вы можете попробовать один из этих вариантов:
jump_config=$(jump-config); cd "${jump_config//\~/$HOME}"
или
cd "$(jump-config |sed 's/~/$HOME/')"
Лучше заключать в кавычки вывод подстановки команд, иначе имена каталогов с пробелами будут неудачными.
Кстати, текущий ответ работает для ~/
, но не для ~username/
, ~-/
или ~+/
, все из которых имеют особое значение для оболочки. В моем ответе на Как вручную расширить специальную переменную (например, тильду) в bash доступен один довольно уродливый, но всеобъемлющий подход.
@ЧарльзДаффи foo=$(echo foo bar); echo $foo
Я не знаю, что ваш комментарий должен доказать. foo='foo bar'; echo $foo
передает аргументы два отдельных в echo
(которые затем разделяются пробелами в своем выводе), но cd
ожидает аргумент единственный, независимо от того, содержит ли этот аргумент буквальные пробелы или нет.
Чтобы решить проблему, я в итоге сделал eval cd $(jump-config)
Этот ответ поставил меня на правильный путь, спасибо.
Вам не нужна подстановка команд, чтобы увидеть это.
dir='~'; cd "$dir"
и у вас такая же проблема.