Você pode passar vários parâmetros para uma função bash usando bash -c?

Você pode passar vários parâmetros para uma função bash usando bash -c?

Estou usando o bash -ccomando 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 founde este é o problema que você precisa resolver primeiro.

A menos que você tenha conseguido exportar funcomo uma função ou definidoem outro lugarde uma forma que permite ao interior bashreconhecer 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 $1em 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 funhá um script de shell.

$0dentro de uma função está $0no 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 funfor 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 -cnã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, bashestes $2e $1estã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á $ino contexto do shell principal;
  • então está $1no contexto do shell interno;
  • então está $2no contexto da função no shell interno.

Não há vantagem em usar bash -caqui, apenas inconveniente. Não complique seu código dessa maneira.

Mais uma coisa:variáveis ​​com aspas duplas.

informação relacionada