다음 방법을 사용하여 "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
이 문서를 읽을 때 쉘이 변수를 확장하는 것을 방지하려면 작은따옴표 또는 백슬래시를 사용할 수 있습니다.모든 사용모든바꾸다:
$ bash <<'EOF'
> a=foo
> echo "$a"
> EOF
foo
$ bash <<EOF
> a=foo
> echo "\$a"
> EOF
foo
여기 문서 내에서 변수 주위에 사용된 따옴표 유형은 여기 문서를 읽을 때 변수가 셸에 의해 확장되는지 여부와 아무 관련이 없습니다.
메모예상치 못한 GLOB 파일 이름 일치가 발생하지 않도록 변수 확장은 항상 큰따옴표로 묶으십시오.
폴리페닐렌 설파이드입력 오류를 포착하려면 셸에서 정의되지 않은 변수 검사를 켜세요. 이를 통해 문제에 대한 아이디어를 얻을 수 있습니다.
피어 투 피어스크립팅에 C 쉘을 사용하지 마십시오. 그 사람들은 실수가 많아 그리고불일치
답변2
여기서는 문자열로 구분된 문서를 사용하고 있습니다 EONG
.
여기에 문서를 소개할 <<word
때단어인용하십시오. 문자가 인용되지 않은 경우 매개변수 확장, 명령 대체 및 산술 확장이 여기에 설명되어 있습니다. 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
위해 이스케이프해야 합니다 .\$a
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"