Что разделяет слово? Почему это важно в программировании оболочки?

А также cd - и pushd и popd который упомянули другие, существует также cd $OLDPWD. обычно cd $OL<TAB> достаточно, автозавершение на работе.

При использовании pushd и popd, удар dirs встроенный может действительно выручить, например: dirs -v печатает стопку каталога с одной записью на строку, снабженный префиксом ее число положения в стеке. попробовать help dirs для больше.

Обратите внимание на это, если Вы хотите изменение в названном каталоге -, если Вы имеете один, вышеупомянутая функция создает проблему. необходимо будет сделать cd ./-. лучше все еще не давайте Вашим каталогам такие имена.

16
13.12.2011, 04:03
3 ответа

Ранние оболочки имели только единственный тип данных: строки. Но распространено управлять списками строк, обычно при передаче нескольких имен файлов как аргументов программе. Другой случай общего использования для разделения - когда команда производит список результатов: вывод команды является строкой, но желаемые данные являются списком строк. Для хранения списка имен файлов в переменной Вы поместили бы пробелы между ними. Затем сценарий оболочки как это

files="foo bar qux"
myprogram $files

названный myprogram с тремя аргументами, поскольку оболочка разделила строку $files в слова. В то время пробелы в именах файлов или запретили или широко считали Не Сделанные.

Оболочка Korn представила массивы: Вы могли сохранить список строк в переменной. Оболочка Korn осталась совместимой с тогдашней установленной Оболочкой Bourne, таким образом, пустые переменные расширения продолжали подвергаться разделению слова, и использование массивов потребовало некоторых синтаксических издержек. Вы записали бы отрывок выше

files=(foo bar qux)
myprogram "${files[@]}"

Zsh имел массивы от запуска, и его автор выбрал более нормальный дизайн языка за счет обратной совместимости. В zsh (по правилам расширения по умолчанию) $var не выполняет разделение слова; если Вы хотите сохранить список слов в переменной, Вы предназначены для использования массива; и если Вы действительно хотите разделение слова, можно записать $=var.

files=(foo bar qux)
myprogram $files

В эти дни пробелы в именах файлов - что-то, с чем необходимо справиться, и потому что многие пользователи ожидают, что они будут работать и потому что много сценариев выполняются в чувствительных к безопасности контекстах, где взломщик может управлять именами файлов. Таким образом, автоматическое разделение слова часто является неприятностью; следовательно мои общие рекомендации, чтобы всегда использовать двойные кавычки, т.е. запись "$foo", если Вы не понимаете, почему Вам нужно разделение слова в конкретном варианте использования. (Обратите внимание, что пустые переменные расширения подвергаются globbing также.)

22
27.01.2020, 19:48
  • 1
    Спасибо Gilles, это действительно полезно! Это корректно, чтобы сказать, что примерно говорящее разделение слова преобразовывает строки формы "word1 word2 word3" в списки/массивы формы "word1" "word2" "word3"? Я также обновил OP с определенным источником беспорядка в zsh. –  Amelio Vazquez-Reina 13.12.2011, 03:56
  • 2
    @intrpc "разделение Word" не разделяет на словах естественного языка, но на $IFS персонажи. Следовательно "полевое разделение" является лучшим именем. Но "разделение слова" часто используется для этого понятия в литературе оболочки. zsh документация придирается на словах. –  Gilles 'SO- stop being evil' 14.12.2011, 12:11
  • 3
    См. также rc (оболочка plan9, также портированная к Unix) для еще лучшего дизайна, чем zsh когда дело доходит до переменных и массивов. слова благодарности –  Stéphane Chazelas 09.02.2013, 01:17

Разделение Word не является действительно конкретной оболочкой.

Большинство программ, которые должны проанализировать ввод текста, использует некоторую форму слова, разделяющего как первый шаг. Это сделано прежде, чем определить от этих "слов", чисел, операторов, строк, маркеров и безотносительно подобных объектов, которые они должны обработать.

То, что конкретно с оболочками, - то, что они должны правильно создать список аргументов из названных команд (C argc/argv, Python sys.argv), включая передающие споры со встроенными пробелами, пустыми аргументами, пользовательские разделители и так далее. Много оболочек используют переменную IFS для разрешения некоторой гибкости там.

3
27.01.2020, 19:48

В этом конкретном случае Zsh разделение слов определяется несколько иначе, чем разделение полей.

Рассмотрим prog a b c, он будет передаваться с тремя аргументами независимо от того, как вы установите IFS. Это разбиение слов .

Если вы выполните A="a b c"; prog $A, будет передано три аргумента, если IFSвключает пробел, или один аргумент в противном случае. Это разбиение поля .

Определения здесь тонкие. Документ Zsh пытается сказать, что даже если вы отключите эту опцию, prog a b cвсе равно будет получать отдельные аргументы (, чего люди всегда ожидают ).

5
27.01.2020, 19:48

Теги

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