Estou usando o bash -c
comando e uma função:
fun ()
{
echo "$0" ## it reads the parameter $i
}
for i in {1..5}
do
bash -c "fun" $i &
done
Minha pergunta é: podemos passar vários parâmetros para funcionar usando bash -c
? por exemplo:
fun ()
{
echo "$0" ## it reads the parameter $i
}
var="string" #variable
for i in {1..5}
do
bash -c "fun" $i $var &
done
Responder1
Você realmente executou o código? Ambos os trechos retornam fun: command not found
e este é o problema que você precisa resolver primeiro.
A menos que você tenha conseguido exportar fun
como uma função ou definidoem outro lugarde uma forma que permite ao interior bash
reconhecer o comando (não vou entrar em detalhes). Esta situação seria bastante enganosa e, portanto, lamentável no contexto de outras questões.
Vamos começar com um código simples que faz o que você provavelmente queria:
#!/bin/bash
fun ()
{
echo "$1"
}
for i in {1..5}
do
fun "$i" &
done
Se você obtiver números fora de sequência, é por causa de &
. Usei &
aqui porque estava no seu código original.
Sua definição da função está sintaticamente correta. Minha definição usa $1
em vez de $0
, vamos chegar lá. Para usar uma função basta chamar seu nome, com ou sem argumentos. No nosso caso:
fun
fun arg1
fun arg1 arg2
Dentro de uma função $1
,,, $2
… expanda para os respectivos argumentos. Você usa $@
(ou $*
se sabe o que está fazendo) para obter todos os argumentos. Você usa $#
para obter o número de argumentos. Isso é muito semelhante a uma situação em que fun
há um script de shell.
$0
dentro de uma função está $0
no shell principal. Não tem nada a ver com argumentos passados para a função.
Você pode executar a função em um subshell:
( fun arg1 )
ou em segundo plano (que também o executa implicitamente em um subshell):
fun arg1 &
Se fun
for uma função no shell principal, esses subshells também saberão o que fazer quando o comando for fun
. Por outro lado, um shell iniciado bash -c
não tem ideia de fun
.
Novamente: a menos que você tenha conseguido export
… ou…
No seu caso bash -c
é um obstáculo. Não vejo sentido em usá-lo. É possível fazê-lo funcionar, mas seria complicado. Ainda assim, seuexplícitoquestão é:
podemos passar vários parâmetros para funcionar usando
bash -c
?
Pudermos. Exemplo complicado abaixo. Observe que a função é um pouco diferente (por motivos educacionais). Também desisti &
porque apenas ofusca os 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
Exportar uma função de Bash para Bash é possível e nós simplesmente fizemos isso. Exportar uma função do Bash para outro shell é impossível, a menos que o shell tente ser compatível e interprete deliberadamente algumas variáveis de ambiente como funções.
fun "$2" "$1"
está entre aspas simples, portanto, no shell principal "$2"
e "$1"
não é expandido (sendo entre aspas simples,eles sãonãoentre aspas duplas). No contexto interno, bash
estes $2
e $1
estão entre aspas duplas e se expandem para os parâmetros fornecidos depois inner-bash
(que é um nome arbitrário aqui).
Veja o que acontece com um número armazenado como $i
:
- está
$i
no contexto do shell principal; - então está
$1
no contexto do shell interno; - então está
$2
no contexto da função no shell interno.
Não há vantagem em usar bash -c
aqui, apenas inconveniente. Não complique seu código dessa maneira.
Mais uma coisa:variáveis com aspas duplas.