Является ли for(( ... )){ ... ;} допустимым синтаксисом оболочки? В каких снарядах?

Программа hostnameвыполняет системный вызов uname, как видно из запуска:

strace hostname
...
uname({sysname="Linux", nodename="my.hostname.com",...}) = 0
...

На справочной странице системного вызова uname говорится, что системный вызов извлекает из ядра следующую структуру:

  struct utsname {
               char sysname[];    /* Operating system name (e.g., "Linux") */
               char nodename[];   /* Name within "some implementation-defined
                                     network" */
               char release[];    /* Operating system release (e.g., "2.6.28") */
               char version[];    /* Operating system version */
               char machine[];    /* Hardware identifier */
           #ifdef _GNU_SOURCE
               char domainname[]; /* NIS or YP domain name */
           #endif
           };

Значит, доменное имя происходит из системы NIS/YP, если верить комментарию. Так что более чем вероятно, что в вашей сети может быть служба NIS / YP, которая возвращает вам имя, установленное ОС ubuntu.

21
23.08.2019, 01:41
1 ответ

{...; } уже был принят вместо do...; doneв циклах forв первой версии оболочки Bourne в Unix V7 в конце 70-х (см. исходный код ), хотя никогда не документировался до сих пор насколько я знаю.

Всеksh(как исходные, полученные из оболочки Борна, так и переписанные ksh93 ), pdksh¹ (и производные ),bash(с самого начала в 1989 г. )и zshподдерживают его. Я не знаю ни одной ashпроизводной, которая это делает. yashтоже нет, но yashбыл написан в соответствии со стандартом POSIX.

В zshподдержка была добавлена ​​в версии 2.0 в 1991 году, но как часть нового диапазона кратких форм для большинства конструкций, выходящих за рамки синтаксиса Борна. Это не только for i in 1 2; {...; }, этоfor i in 1 2; any-command(и его варианты ). И это задокументировано там и было с момента его введения .

AFAIK, помимо zsh, только pdksh документирует это (как для for, так и дляselect).

Что касается формы ((init; condition; action)), которая происходит от ksh93и была скопирована zshи bash.

Ни ((...)), ни {...; }вместо do...; doneне являются POSIX.

См. также Каково назначение ключевого слова do в циклах for в Bash? для получения дополнительных forформ цикла.


¹ ни более ранние версии, ни оболочка Forsyth, на которой она основана. Он был добавлен в 5.1.1 в 1994 году, и это, вероятно, объясняет, почему он был там задокументирован

.
30
27.01.2020, 19:43

Теги

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