bash -c를 사용하여 bash 함수에 여러 매개변수를 전달할 수 있나요?

bash -c를 사용하여 bash 함수에 여러 매개변수를 전달할 수 있나요?

나는 bash -c명령과 기능을 사용하고 있습니다 :

fun ()
{
echo "$0"  ## it reads the parameter $i
}

for i in {1..5}
do
bash -c "fun" $i &
done

내 질문은 을 사용하여 함수에 여러 매개 변수를 전달할 수 있습니까 bash -c? 예를 들어:

fun ()
{
echo "$0"  ## it reads the parameter $i
}

var="string"  #variable

for i in {1..5}
do
bash -c "fun" $i $var &
done

답변1

실제로 코드를 실행해 보셨나요? 두 조각 모두 반환되며 fun: command not found이것이 먼저 해결해야 할 문제입니다.

fun함수로 내보내거나 정의하지 않는 한다른 곳에서bash내부가 명령을 인식할 수 있도록 하는 방식입니다 (자세히 설명하지는 않겠습니다). 이 상황은 상당히 오해를 불러일으킬 수 있으므로 향후 문제의 맥락에서 불행한 일입니다.

아마도 원하는 것을 수행하는 간단한 코드부터 시작해 보겠습니다.

#!/bin/bash

fun ()
{
   echo "$1"
}

for i in {1..5}
do
   fun "$i" &
done

숫자가 순서대로 나오지 않으면 &. &원래 코드에 있었기 때문에 여기를 사용했습니다 .

함수 정의가 구문적으로 괜찮습니다. 내 정의는 $1대신 $0에 를 사용합니다. 함수를 사용하려면 인수가 있든 없든 이름을 부르기만 하면 됩니다. 우리의 경우:

fun
fun arg1
fun arg1 arg2

함수 내에서 $1, $2, … 해당 인수로 확장합니다. 모든 인수를 얻으려면 를 사용합니다 $@(또는 $*수행 중인 작업을 알고 있는 경우). $#인수 수를 얻는 데 사용합니다 . 이는 fun쉘 스크립트 의 상황과 매우 유사합니다 .

$0함수 내부는 $0메인 쉘에 속합니다. 함수에 전달된 인수와는 아무런 관련이 없습니다.

서브셸에서 함수를 실행할 수 있습니다.

( fun arg1 )

또는 백그라운드에서(암시적으로 서브셸에서도 실행됨):

fun arg1 &

fun가 메인 셸의 함수인 경우 이러한 하위 셸은 명령이 . 일 때 수행할 작업도 알 수 있습니다 fun. 반면에 로 시작하는 쉘 bash -cfun.

export다시 말하지만, 당신이 ... 또는 ... 에 성공하지 않는 한

귀하의 경우 bash -c오히려 장애물입니다. 나는 그것을 사용하는 데 아무런 의미가 없다고 생각합니다. 작동하게 만드는 것은 가능하지만 번거로울 것입니다. 그래도 당신의명백한질문은 다음과 같습니다

을 사용하여 여러 매개변수를 함수에 전달할 수 있습니까 bash -c?

우리는 할 수 있습니다. 아래의 번거로운 예입니다. 기능이 약간 다릅니다(교육적 이유로). 또한 &결과를 난독화할 뿐이므로 삭제했습니다 .

#!/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

Bash에서 Bash로 함수를 내보내는 것이 가능하며 방금 했습니다. 쉘이 호환되도록 시도하고 의도적으로 일부 환경 변수를 함수로 해석하지 않는 한 Bash에서 다른 쉘로 함수를 내보내는 것은 불가능합니다.

fun "$2" "$1"작은 따옴표로 묶여 있으므로 메인 쉘에서는 "$2"확장 "$1"되지 않습니다(작은 따옴표로 묶음,그들은~ 아니다큰따옴표). 내부 컨텍스트에서 bash이러한 $2$1는 큰따옴표로 묶이고 뒤에 제공되는 매개변수 inner-bash(여기서는 임의의 이름임)로 확장됩니다.

다음과 같이 저장된 숫자가 어떻게 되는지 확인하세요 $i.

  • 이는 $i메인 쉘의 맥락에 있습니다.
  • $1그런 다음 내부 쉘의 맥락에 있습니다 .
  • $2그런 다음 내부 쉘에 있는 함수의 컨텍스트에 있습니다 .

이곳을 이용하면 장점은 없고 bash -c불편함만 있을 뿐입니다. 이런 식으로 코드를 복잡하게 만들지 마십시오.

하나 더:큰따옴표 변수.

관련 정보