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

Ruby shell вместо bash shell в Ubuntu?
Windows 10 Bash команда не работает, несмотря на включение режима разработчика и включение " Подсистема Windows для Linux"
Как удалить / сбросить подсистему Windows для Linux на Windows Insider сборки 14316
Как выполнить несколько команд в bash, некоторые в фоновом режиме
команда rm: удалить файлы с именами, содержащими скобки
Как остановить запуск jar-файла в скрипте bash через 5 минут и запустить следующий?
Проблема с неправильной командой, введенной в Fish-shell, и ее выводом
Использование sed для включения.файлы htaccess в конфигурации Apache
Rsync Удаленная Локальная Проблема
Seamonkey не запускается в Debian Stretch
Возможно ли иметь различную цветовую схему в ConEmu?
Как ограничить разрешения cygwin в Windows 7
команда баш на Mac терминал не работает
команда cat выводит весь каталог при использовании в скрипте bash
Использование systemd для выполнения интерактивного сценария (whiptail) после многопользовательского.цель, но до экрана входа в систему

Пробелы в переменных среды Linux?

данного каталога: /media/foo/can haz/bar, Я пробовал редактирования bash.rc С:

export Foo=/media/foo/can haz/bar
export Foo=/media/foo/can haz/bar
export Foo='/media/foo/can haz/bar'
export Foo="/media/foo/can haz/bar"
export Foo='"/media/foo/can haz/bar"'
export Foo="'/media/foo/can haz/bar'"

каждый раз, хотя я не мог сделать что-то вроде следующего, чтобы работать (без использования "$Foo"):

cd $Foo

как задать переменную среды с пробелами в системе Linux?

5
задан A T
источник

2 ответов

проблема не в том, что переменная окружения содержит пробел. Ты забываешь цитирую ваши доводы:

cd "$Foo"

если вы не цитата $Foo,cd команда увидит два (или более) аргумента, так как пробелы по умолчанию разделяет аргументы. В вашем конкретном случае вы пройдете /media/foo/can и haz/bar отдельно, так как оболочка разделяет их в пространстве. Двойные кавычки переменных-хорошая привычка развиваться, и сэкономит вам довольно много случаев, когда задействованы пробелы.

если вы хотите действительно уродливый способ достижения этого без кавычек, перепишите cd builtin вроде так:

cd() { builtin cd "$*"; }

это будет работать, если путь содержит пробелы, так как $* будет содержать отдельные аргументы (/media/foo/can и haz/bar), разделенные первым символом IFS (обычно пробелом), а затем вы склеите их вместе с двойными кавычками.

это не хорошо идея перезаписать builtins, как это, хотя.

8
отвечен slhck 2013-07-06 18:36:27
источник

как сказал @slhck, правильный способ сделать это-поставить двойные кавычки вокруг ссылки на переменную (например,cd "$Foo"). Причиной этого является порядок, в котором оболочка анализирует различные аспекты командной строки: сначала она сканирует кавычки и экранирует (и удаляет их по мере применения их эффектов), а затем заменяет ссылки на переменные их значениями (например,$Foo ->/media/foo/can haz/bar), затем он возвращается к замененным значениям и применяет подстановочное расширение (*.txt ->a.txt b.txt etc) и слово расщепление (/media/foo/can haz/bar - > "/ media/foo/can" "haz/bar"), но он никогда не возвращается и ищет кавычки и / или экранирования в значениях переменных. В результате встраивание кавычек и / или экранирования в значение переменной делает ничего хоть чуть-чуть полезным; к тому времени, как они станут частью командной строки, для них будет слишком поздно получить желаемый эффект. Я знаю только три способа избежать разбиения слов на расширенное значение:

  1. заключить ссылку на переменную в двойные кавычки. это не так удобно, но это требование стандартного синтаксиса оболочки.
  2. изменить значение IFS (список символов, используемых для разбиения слов на расширенные переменные). Затем наблюдайте, как все сценарии, которые зависят от стандартного поведения разбиения слов, странно ломаются. Пожалуйста, не делай этого. Серьезно.
  3. переключиться на оболочку, которая не разбивает слова на расширенные переменные: zsh. Вам придется привыкнуть к его другим отличиям от bash, но если вы действительно хотите это лучший способ пойти. Я не использую его сам, но тем, кто, похоже, очень нравится...
2
отвечен Gordon Davisson 2013-07-06 21:32:53
источник