Estoy usando el bash -c
comando y una función:
fun ()
{
echo "$0" ## it reads the parameter $i
}
for i in {1..5}
do
bash -c "fun" $i &
done
Mi pregunta es ¿podemos pasar múltiples parámetros para funcionar usando bash -c
? Por ejemplo:
fun ()
{
echo "$0" ## it reads the parameter $i
}
var="string" #variable
for i in {1..5}
do
bash -c "fun" $i $var &
done
Respuesta1
¿Realmente has ejecutado el código? Ambos fragmentos regresan fun: command not found
y este es el problema que debes abordar primero.
A menos que haya logrado exportar fun
como una función o la haya definidoen otra partede una manera que permita al interior bash
reconocer la orden (no daré más detalles). Esta situación sería bastante engañosa y, por tanto, desafortunada en el contexto de futuras cuestiones.
Comencemos con un código sencillo que hace lo que probablemente querías:
#!/bin/bash
fun ()
{
echo "$1"
}
for i in {1..5}
do
fun "$i" &
done
Si obtienes números que no están en secuencia, es por &
. Lo usé &
aquí porque estaba en tu código original.
Su definición de la función es sintácticamente correcta. Mi definición usa $1
en lugar de $0
, llegaremos a eso. Para usar una función simplemente dice su nombre, con o sin argumentos. En nuestro caso:
fun
fun arg1
fun arg1 arg2
Dentro de una función $1
, $2
,… expanda a los argumentos respectivos. Usas $@
(o $*
si sabes lo que estás haciendo) para obtener todos los argumentos. Se utiliza $#
para obtener el número de argumentos. Esto es muy similar a una situación en la que fun
hay un script de shell.
$0
dentro de una función es $0
del shell principal. No tiene nada que ver con los argumentos pasados a la función.
Puede ejecutar la función en un subshell:
( fun arg1 )
o en segundo plano (que implícitamente también lo ejecuta en un subshell):
fun arg1 &
Si fun
es una función en el shell principal, estos subshells también sabrán qué hacer cuando el comando sea fun
. Por otro lado, un shell que comienza con bash -c
no tiene idea de fun
.
Nuevamente: a menos que hayas logrado export
... o...
En su caso bash -c
es más bien un obstáculo. No veo ningún sentido en usarlo. Es posible hacerlo funcionar pero sería engorroso. Aún así, tuexplícitoLa pregunta es:
¿Podemos pasar múltiples parámetros para funcionar usando
bash -c
?
Podemos. Ejemplo engorroso a continuación. Tenga en cuenta que la función es ligeramente diferente (por motivos educativos). También lo descarté &
porque sólo confunde los resultados.
#!/bin/bash
fun ()
{
echo "$2"
}
export -f fun
var="string"
for i in {1..5}
do
bash -c 'fun "$2" "$1"' inner-bash "$i" "$var"
done
Es posible exportar una función de Bash a Bash y lo acabamos de hacer. Exportar una función de Bash a otro shell es imposible, a menos que el shell intente ser compatible e interprete deliberadamente algunas variables de entorno como funciones.
fun "$2" "$1"
está entre comillas simples, por lo que en el shell principal "$2"
y "$1"
no se expanden (al estar entre comillas simples,ellos sonnoentre comillas dobles). En el contexto interno, bash
estos $2
y $1
están entre comillas dobles y se expanden a los parámetros proporcionados después inner-bash
(que es un nombre arbitrario aquí).
Vea lo que sucede con un número almacenado como $i
:
- está
$i
en el contexto del shell principal; - entonces está
$1
en el contexto del caparazón interior; - entonces está
$2
en el contexto de la función en el caparazón interno.
No hay ninguna ventaja de usarlo bash -c
aquí, solo inconvenientes. No compliques tu código de esta manera.
Una cosa más:variables de comillas dobles.