Передача каталога на cd

Вам нужно добавить пробелы.

Заменить

if [ $var1=$var2 ]; 

с

if [ "$var1" = "$var2" ];

то же самое для второго оператора if.

0
01.03.2020, 12:24
1 ответ

Здесь есть три вопроса:

  1. Путь к каталогу задается как cdкак литеральная строка ~/Downloads/demo, хотя правильный путь может быть чем-то вроде /Users/snickers/Download/demo.

    Обычно, когда вы вводите cd ~/Downloads/demoв командной строке, перед запуском команды cdоболочка заменяет тильду на путь к вашему домашнему каталогу. Здесь этого не происходит, потому что раскрытие тильды происходит перед расширением переменной (см. " Как понять порядок между расширениями? " ).

    Предполагая, что вы используете оболочку bash, использование dirs -lможет обойти эту проблему, позволяя dirsвыводить полный путь.

  2. cd— оболочка, построенная -в команде. На вашем компьютере с macOS он также доступен в виде внешней команды /usr/bin/cd, поэтому вы не получаете ошибку «команда не найдена», как многие другие пользователи Unix получают при использовании cdс xargs. Однако внешняя команда cdникогда не сможет изменить каталог для текущей оболочки. Это описано в "Почему cd не является программой? " и "где находится `cd `? " и в подобных вопросах.Ваш вариант функции оболочки обходит эту проблему, поскольку он использует встроенную команду -в cdвашей оболочки.

  3. Последняя проблема, которая является вариантом 2-й проблемы и которая на самом деле не вступает в игру из-за других проблем, заключается в том, что команда cd, выполняемая xargs, является не только внешней команда, которая не может изменить рабочий каталог для вызывающей оболочки, но вызывающая ее команда — xargs, которая, в свою очередь, выполняется в подоболочке -как этап вашего конвейера. Изменение оболочки в подчиненной оболочке -не изменит ее в родительской оболочке.

Вы должны иметь возможность использовать

fdr () {
   cd "$( dirs -l -p | fzf )"
}

где dirs -l -pвыводит один каталог из стека каталогов в bashна строку с развернутыми тильдами. Это предполагает, что у вас нет каталогов в стеке со встроенными символами новой строки в именах, но будет поддерживать каталоги с пробелами (, чего не делает ваша собственная функция, отчасти из-за sedпреобразований. и отчасти из-за того, что не цитируется расширение $dir).

6
28.04.2021, 23:21

Теги

Похожие вопросы