나는 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 -c
은 fun
.
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
불편함만 있을 뿐입니다. 이런 식으로 코드를 복잡하게 만들지 마십시오.
하나 더:큰따옴표 변수.