В Advanced Bash-Scripting Guide , в примере 27-4 , 7-я строка снизу, я прочитал это:
Функция выполняется как подпроцесс.
Я сделал тест в Bash, и кажется, что приведенное выше утверждение неверно.
Поиски на этом сайте, Bash Man, и моя поисковая система не проливают свет.
У вас есть ответ и вы хотели бы объяснить?
Ответы:
Расширенное руководство по написанию сценариев не всегда надежно, и его примеры сценариев содержат устаревшие методы, такие как использование устаревших обратных галочек для подстановки команд, т. Е.
`command`
Вместо$(command)
.В данном конкретном случае это явно неправильно.
Раздел о функциях оболочки в (каноническом) руководстве по Bash однозначно утверждает, что
источник
Функции фигурных скобок будут выполняться внутри вызывающего процесса оболочки, если только им не нужен собственный подоболочек, который:
&
Перенаправления или дополнительные env. переменные не будут вызывать новый подоболочек:
Если вы определяете функцию с круглыми скобками вместо фигурных скобок:
это всегда будет работать в новом процессе.
Подстановка команд
$()
также всегда создает процессы в bash (но не в ksh, если вы запускаете встроенные команды внутри него).источник
f() (...)
, разрешено. Есть ли другие определения, кроме{...}
и(...)
? В Bash я еще не знаком с другими.function hw { echo hello world; }
синтаксис (нет необходимости,()
если вы печатаете ,function
и вы можете указать перенаправления сразу после финала}
или)
как вhw(){ echo error; } >&2
. Вот и все.f()(...)
всегда выполняйте собственную оболочку, аf(){...}
не выполняйте.foo() [[ x = x ]]
допустимо и определение функции. Однако, если вы посмотрите на функцию с,type foo
вы увидите, что это все еще синтаксический сахар дляfoo() { [[ x = x ]]; }
. То же самое относится и к функциям subshell:bar() ( : )
становитсяbar() { ( : ); }
.Рассматриваемая команда из этого примера выглядит следующим образом:
Пример позже заявляет:
Будучи благотворительными для ABS Guide, они, очевидно, хотели написать, что функция выполняется внутри подстановки команд, а команда внутри подстановки команд выполняется в подоболочке .
источник