"newgrp"에 의해 시작되는 하위 쉘에 명령을 전달하기 위해 다음 방법을 사용하고 있습니다.

#!/bin/csh
echo "Before newgrp"
/usr/bin/newgrp users <<EONG
echo "hello from within newgrp"
id
EONG
echo "After newgrp"

서브셸에서 아무 것도 "설정"하지 않는 한 잘 작동합니다.

#!/bin/csh
echo "Before newgrp"
/usr/bin/newgrp users <<EONG
echo "hello from within newgrp"
set a=npy
echo $a
id
EONG
echo "After newgrp"

위에서 볼 수 있듯이 서브셸 내부에 a=npy를 설정하고 echo $a를 수행하면 npy가 반환됩니다. 그러나 a가 선언되지 않아 오류가 발생합니다.

누군가가 사용하는 동안 서브쉘 내부에 환경 변수를 설정하는 방법을 말해 줄 수 있습니까?<<

답변1

구조 <<는 쉘을 도입합니다여기 문서이는 읽을 때 큰따옴표로 묶인 문자열인 것처럼 처리되므로 변수는 쉘에서 읽을 때 즉시 확장됩니다. 정의되지 않은 변수에 대해 알려주는 셸 기능을 활성화하면 이를 명확하게 볼 수 있습니다. 여기서는 BASH 셸에서 해당 기능을 사용하겠습니다.

$ set -o nounset
$ echo "$a"
bash: a: unbound variable
$ bash <<EOF
> a=foo
> echo "$a"
> EOF
bash: a: unbound variable

here 문서를 읽는 동안 쉘이 변수를 확장하지 못하도록 하려면 태그를 작은따옴표로 묶거나 백슬래시를 사용하면 됩니다.모든 사용모든변하기 쉬운:

$ bash <<'EOF'
> a=foo
> echo "$a"
> EOF
foo

$ bash <<EOF
> a=foo
> echo "\$a"
> EOF
foo

here 문서 내의 변수 주위에 사용된 따옴표 유형은 here 문서를 읽을 때 변수가 셸에 의해 확장되는지 여부와 아무 관련이 없습니다.

추신의도하지 않은 GLOB 파일 이름 일치가 발생하지 않도록 변수 확장을 항상 큰따옴표로 묶으십시오.

pps입력 오류를 포착하려면 쉘에서 정의되지 않은 변수 검사를 켜십시오. 이것은 당신의 문제에 대한 단서를 제공했을 것입니다.

ppps스크립팅에 C 쉘을 사용하지 마십시오. 그 사람들은 버그가 많아요 그리고불일치

답변2

문자열로 구분된 here-document를 사용하고 있습니다 EONG.

를 사용하여 여기 문서를 도입할 때 <<word여기 문서가 확장 대상인지 여부는단어인용됩니다. 문자가 인용되지 않은 경우 here-document는 매개변수 확장, 명령 대체 및 산술 확장의 적용을 받습니다. 적어도 하나의 문자가 인용되면 여기 문서는 확장되지 않습니다. Bourne 및 Korn(그리고 POSIX) 쉘은 완전히 인용되지 않은단어C 쉘은 최종 구분 기호로 사용합니다.단어있는 그대로.

예제를 다음과 같이 다시 작성할 수 있습니다.

#!/bin/csh
echo "Before newgrp"
/usr/bin/newgrp users <<"EONG"
echo "hello from within newgrp"
set a=npy
echo $a
id
"EONG"
echo "After newgrp"

그렇지 않으면 인용되지 않은단어, stdin으로 전달되기 전에 쉘에 의해 대체되는 것을 방지하기 위해 $a이스케이프 해야 합니다 .\$anewgrp

#!/bin/csh
echo "Before newgrp"
/usr/bin/newgrp users <<EONG
echo "hello from within newgrp"
set a=npy
echo \$a
id
EONG
echo "After newgrp"

관련 정보