Mylę się co do roli, jaką odgrywa podział słów zsh
. Nie byłem narażony na tę koncepcję podczas programowania w C, Python lub MATLAB, co spowodowało moje zainteresowanie tym, dlaczego dzielenie słów wydaje się być czymś specyficznym dla programowania powłoki.
Czytałem wcześniej o dzieleniu słów na tej i innych stronach, ale nie znalazłem jasnego wyjaśnienia tego pojęcia. Wikipedia ma definicję podziału słów, ale wydaje się, że nie ma odniesień do tego, jak ma ona zastosowanie do powłok uniksowych.
Oto przykład mojego zamieszania w zsh
:
W FAQ Z Shell przeczytałem:
3.1: Dlaczego
$var
gdzievar="foo bar"
nie robić to, co się spodziewać?W większości pochodnych powłoki Bourne'a zmienne o wielu słowach, takie jak
var="foo bar"
dzielone na słowa po przekazaniu do polecenia lub wfor foo in $var
pętli. Domyślnie zsh nie ma takiego zachowania: zmienna pozostaje nienaruszona. (To nie jest błąd! Zobacz poniżej.)SH_WORD_SPLIT
Istnieje opcja zapewniająca zgodność.
Jednak w podręczniku Z Shell przeczytałem:
SH_WORD_SPLIT (-y) <K> <S>
Powoduje, że podział na pola jest wykonywany dla niecytowanych rozszerzeń parametrów. Pamiętaj, że ta opcja nie ma nic wspólnego z dzieleniem słów. (Zobacz Rozszerzanie parametrów.)
Dlaczego mówi, że nieSH_WORD_SPLIT
ma to nic wspólnego z dzieleniem słów? Czy słowo nie dzieli dokładnie tego, o co w tym wszystkim chodzi?
"word1 word2 word3"
w listy / tablice formularza"word1" "word2" "word3"
? Zaktualizowałem również OP o konkretne źródło zamieszania w Zsh.$IFS
znaki. Dlatego „podział pola” jest lepszą nazwą. Ale „dzielenie słów” jest często używane w tej koncepcji w literaturze powłoki. Dokumentacja Zsh spiera się o słowa.rc
(powłoka plan9, również przeniesiona do Uniksa), aby uzyskać jeszcze lepszy projekt niż zsh, jeśli chodzi o zmienne i tablice.Podział słów nie jest tak naprawdę specyficzny dla powłoki.
Większość programów, które muszą analizować wprowadzanie tekstu, używa pewnego rodzaju podziału słów jako pierwszego kroku. Odbywa się to przed identyfikacją na podstawie tych „słów”, liczb, operatorów, ciągów, tokenów i wszelkich podobnych podmiotów, które muszą przetworzyć.
Specyficzne dla powłok jest to, że muszą poprawnie zbudować listę argumentów poleceń o nazwie (C argc / argv, python sys.argv), w tym przekazywanie argumentów z osadzonymi spacjami, pustymi argumentami, niestandardowymi ogranicznikami i tak dalej. Wiele powłok używa zmiennej IFS, aby zapewnić tam pewną elastyczność.
źródło
W tym konkretnym przypadku Zsh podział słowa jest definiowany nieco inaczej niż podział pola.
Zastanów się
prog a b c
, przekaże trzy argumenty, bez względu na to, jak ustawiszIFS
. To jest dzielenie słów .Jeśli to zrobisz
A="a b c"; prog $A
, przekaże trzy argumenty, jeśliIFS
zawiera spację lub jeden argument inaczej. To jest dzielenie pól .Definicje tutaj są subtelne. Dokument Zsh próbuje powiedzieć, że nawet jeśli wyłączysz tę opcję,
prog a b c
nadal otrzymają osobne argumenty (czego ludzie zawsze oczekują).źródło