Вам нужно добавить пробелы.
Заменить
if [ $var1=$var2 ];
с
if [ "$var1" = "$var2" ];
то же самое для второго оператора if
.
Здесь есть три вопроса:
Путь к каталогу задается как cd
как литеральная строка ~/Downloads/demo
, хотя правильный путь может быть чем-то вроде /Users/snickers/Download/demo
.
Обычно, когда вы вводите cd ~/Downloads/demo
в командной строке, перед запуском команды cd
оболочка заменяет тильду на путь к вашему домашнему каталогу. Здесь этого не происходит, потому что раскрытие тильды происходит перед расширением переменной (см. " Как понять порядок между расширениями? " ).
Предполагая, что вы используете оболочку bash
, использование dirs -l
может обойти эту проблему, позволяя dirs
выводить полный путь.
cd
— оболочка, построенная -в команде. На вашем компьютере с macOS он также доступен в виде внешней команды /usr/bin/cd
, поэтому вы не получаете ошибку «команда не найдена», как многие другие пользователи Unix получают при использовании cd
с xargs
. Однако внешняя команда cd
никогда не сможет изменить каталог для текущей оболочки. Это описано в "Почему cd не является программой? " и "где находится `cd `? " и в подобных вопросах.Ваш вариант функции оболочки обходит эту проблему, поскольку он использует встроенную команду -в cd
вашей оболочки.
Последняя проблема, которая является вариантом 2-й проблемы и которая на самом деле не вступает в игру из-за других проблем, заключается в том, что команда cd
, выполняемая xargs
, является не только внешней команда, которая не может изменить рабочий каталог для вызывающей оболочки, но вызывающая ее команда — xargs
, которая, в свою очередь, выполняется в подоболочке -как этап вашего конвейера. Изменение оболочки в подчиненной оболочке -не изменит ее в родительской оболочке.
Вы должны иметь возможность использовать
fdr () {
cd "$( dirs -l -p | fzf )"
}
где dirs -l -p
выводит один каталог из стека каталогов в bash
на строку с развернутыми тильдами. Это предполагает, что у вас нет каталогов в стеке со встроенными символами новой строки в именах, но будет поддерживать каталоги с пробелами (, чего не делает ваша собственная функция, отчасти из-за sed
преобразований. и отчасти из-за того, что не цитируется расширение $dir
).