Пробелы в переменных среды 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?

30
задан A T
22.03.2023 0:52 Количество просмотров материала 2561
Распечатать страницу

2 ответа

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

cd "$Foo"

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

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

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

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

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

8
отвечен slhck 2023-03-23 08:40

как сказал @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 2023-03-23 10:57

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх