En Advanced Bash-Scripting Guide , en el ejemplo 27-4 , 7ª línea desde abajo, he leído esto:
Una función se ejecuta como un subproceso.
Hice una prueba en Bash, y parece que la afirmación anterior está mal.
Las búsquedas en este sitio, Bash Man, y mi motor de búsqueda no aportan ninguna luz.
¿Tienes la respuesta y te gustaría explicar?
Respuestas:
La Guía avanzada de secuencias de comandos de Bash no siempre es confiable y sus secuencias de comandos de ejemplo contienen prácticas desactualizadas, como el uso de backticks obsoletos para la sustitución de comandos, es decir, en
`command`
lugar de$(command)
.En este caso particular, es descaradamente incorrecto.
La sección sobre Funciones de Shell en el manual (canónico) Bash establece definitivamente que
fuente
Las funciones de llaves se ejecutarán dentro del proceso del shell de llamada, a menos que necesiten su propio subshell que es:
&
Redirecciones o env extra. las variables no forzarán una nueva subshell:
Si define la función con paréntesis en lugar de curvas:
siempre se ejecutará en un nuevo proceso.
La sustitución de comandos
$()
también siempre crea procesos en bash (pero no en ksh si ejecuta incorporados dentro de él).fuente
f() (...)
está permitido. ¿Hay otras definiciones aparte de{...}
y(...)
? En Bash, todavía no estoy interesado en los demás.function hw { echo hello world; }
sintaxis (no es necesario()
si escribefunction
y puede especificar las redirecciones justo después de la final}
o)
como enhw(){ echo error; } >&2
. Eso es todo.)f()(...)
siempre ejecuta un propio shell, mientrasf(){...}
que no lo hace.foo() [[ x = x ]]
es una definición de función válida. Sin embargo, si observa la función contype foo
, verá que todavía es azúcar sintácticafoo() { [[ x = x ]]; }
. Lo mismo puede decirse de las funciones subshell:bar() ( : )
se conviertebar() { ( : ); }
.El comando en cuestión de ese ejemplo se ve así:
El ejemplo posterior dice:
Al ser caritativo con ABS Guide, lo que aparentemente querían escribir es que la función se ejecuta dentro de una sustitución de comando y el comando dentro de una sustitución de comando se ejecuta en una subshell .
fuente