인라인 쉘 스크립트로 변수를 보내는 방법은 무엇입니까?


26

다음 스크립트를 실행합니다.

VAR="Test"
sh -c 'echo "Hello $VAR"'

그러나 나는 얻는다 :

# ./test.sh
Hello

VAR스크립트 변수 를로 작성된 쉘에 어떻게 보낼 수 sh -c '...'있습니까?

답변:


44

어느 쪽의 사용 export환경 변수로 돌려 또는 명령에 직접 전달할.

VAR="Test" sh -c 'echo "Hello $VAR"'

VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'

다음과 같이 명령 삽입 취약점을 유발하므로 보간을 허용하기 위해 쉘 코드 주위에 큰 따옴표를 사용하지 마십시오.

sh -c "echo 'Hello $ VAR'"

$VAR다음과 같은 내용이 포함 된 경우 호출되면 재부팅';reboot #


실제로는 실용적이지 않지만 (여러 변수가 있으며 환경 변수가되고 싶지는 않습니다) 감사합니다!
Matthieu Napoli

3
@Matthieu : 걱정되는 경우 프로세스의 자식에 대한 환경 변수로만 설정됩니다 .
Piskvor

5
참고 export var="Test"로 한 줄로 도 할 수 있습니다 .
user606723

@Piskvor는 정확성에 감사드립니다. 그럼 완벽합니다.
Matthieu Napoli

9

다음은 변수를 sh -c위치 인수로 전달하는 또 다른 방법입니다 .

{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}

1
(+1) 스크립트 변수에 대한 일반적인 $ 1 $ 2 기대 값에 더 가깝게 유지하려면 $ 0의 더미 값을 가질 수 있습니다. $@예를 들어 예상대로 작동 할 수 있습니다. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"`
Peter.O

2
@ Peter.O "_"를 사용하는 대신 "sh"또는 적절한 이름 을 사용하여 해당 명령에 제공합니다 $0. 쉘에 의해 오류 / 경고 메시지에 표시 되기 때문입니다 .
Stéphane Chazelas

5

환경 변수로 내 보내지 않으려면 다음을 수행하십시오. variabe 정의를 파일에 저장하고 다음 .var_init.sh과 같이 하위 셸에서 소스를 지정하십시오.

.var_init.sh

VAR="Test"

명령 행에서 :

sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'

이런 식으로, 서브 쉘 실행시에만 변수를 설정합니다.


... 또는ENV=.var_ini.sh sh -c '...'
Kusalananda

그것이 .var_init.sh현재 디렉토리에서 찾을 것으로 예상 된다면 ()과 반대로 $PATH작성되어야합니다.. ./var_init.sh
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.