[email protected] - программирование" />

Какова внутренняя обработка $* и [email protected]

Собственно, я полностью понимаю использование $* и [email protected]

Например, если я запустил script, используя: my_script *

Затем для ONE_FILE в [email protected]действительно будет каждый файл в ONE_FILE для обработки.
Даже есть пробелы (имена) в именах файлов, ONE_FILE получит правильное имя файла.

Если, однако, использование для ONE_FILE в $*, история отличается.
Я думаю, вы, ребята, понимаете разницу, и мне не нужно идти дальше.

Теперь меня интересует КАК.
Как KornShell (ksh) интерпретирует my_scrpt *
а затем передать имена файлов в [email protected]правильно
и передать имена файлов в $*.

Например, когда ksh видит my_script *
, он помещает имена файлов один за другим в массив,
а затем поместить массив [1] [2] [3]... в [email protected]для обработки?
И, видя $*, он просто согласен filename1 + space + filename2 + space +...?

Я знаю, что это может относиться скорее к внутреннему кодированию ksh.

Любое понимание?

Ответ 1

Например, когда оболочка korn видит my_script *, она помещает имена файлов один за другим в массив, а затем поместить массив [1] [2] [3]... в [email protected]для обработки? И, видя $*, это просто конкат filename1 + space + filename2 + space +...?

Да, в значительной степени.

Одна важная вещь для реализации здесь состоит в том, что есть два отдельных процесса: вызывающая оболочка, которая расширяет my_script * на myscript arg1 arg2 arg3 и подпроцесс, который получает массив аргументов. Если этот подпроцесс ksh (или sh, bash или аналогичная оболочка), то $* является просто синтаксисом для "get argv [1...] как конкатенированная строка", тогда как [email protected] является синтаксисом для "get argv [1...] как массив". Важно также отметить, что $* и [email protected] имеют смысл только при цитировании.

В bash, двоюродный брат ksh, эта идея переменных массива фактически была обобщена. (Возможно, ksh тоже это сделал - я не использовал ksh около десятилетия...)

В bash создается массив из 3 элементов, называемых a. Обратите внимание, что первый элемент содержит пробел:

[~]$ a=("foo bar" baz quux)
[~]$ for i in ${a[*]}; do echo $i; done
foo
bar
baz
quux
[~]$ for i in ${a[@]}; do echo $i; done
foo
bar
baz
quux
[~]$ for i in "${a[*]}"; do echo $i; done
foo bar baz quux
[~]$ for i in "${a[@]}"; do echo $i; done
foo bar
baz
quux

Как видно из примера, "${a[*]}" объединяет массив, а "${a[@]}" фактически дает вам отдельные элементы.