csh 스크립트 소싱이 잘못된 대체 없이 경로 변수를 설정하지 않습니다.

csh 스크립트 소싱이 잘못된 대체 없이 경로 변수를 설정하지 않습니다.

다음과 같은 소스 경로 변수에 대한 간단한 스크립트를 작성하고 있습니다.

#!/bin/csh
echo "setting path"
set path=($path /sbin:/mscc/apps)

그러나 경로 변수는 변경되지 않고 동일하게 유지됩니다. 오류/경고 없이 csh 쉘을 실행합니다.

다음과 같이 잘못된 행을 추가하면:

setenv PATH $PATH:sbin

"불량한 대안"에 대해 불평했습니다. 하지만 위의 두 경로가 추가되었습니다. 왜 이런 일이 발생합니까?

답변1

내가 복사할 수 있는 경우에만 이 항목을 복사할 수 있습니다.구현하다다음과 같은 스크립트:

$ echo $path
/usr/local/bin /usr/bin /usr/local/sbin /usr/sbin

$ ./script.csh
setting path
$ echo $path
/usr/local/bin /usr/bin /usr/local/sbin /usr/sbin

다음으로 변경하면원천스크립트를 실행하면 다른 동작이 표시됩니다.

$ source script.csh
setting path
$ echo $path
/usr/local/bin /usr/bin /usr/local/sbin /usr/sbin /sbin:/mscc/apps

/sbin /mscc/apps( 콜론 대신 공백으로 요소를 구분하고 싶습니까 ?)

답변2

이건 다르다달리기스크립트와 source스크립트. 때를달리기스크립트( 사용 ./script.sh)는 스크립트를 실행할 새 프로세스를 생성합니다. 그 사이에 쉘 프로세스(당신이 작성한 프로세스 ./script.sh)는 다른 프로세스가 완료될 때까지 기다리며 출력을 캡처할 수도 있습니다.

생성된 프로세스는 자체 환경(예: 변수 path)을 수정할 수 있지만 상위 프로세스의 환경은 수정할 수 없습니다. 완료되면 프로세스가 종료되고 상위 프로세스는 에서 동일한 값을 유지합니다 path.

당신이 원하는 것은 상위 프로세스를 실행하는 것입니다 set path=($path /sbin:/mscc/apps). 이렇게 하려면 source ./script.sh대신 을 씁니다 ./script.sh. 이 경우 #!/bin/csh해당 줄은 단지 주석이므로 필요하지 않습니다.

답변3

이 두 가지 모두 HPUX의 csh에서 저에게 효과적이었습니다.

버전 1($path 업데이트됨):

#!/bin/csh
echo "setting path"
set path=($path:q /sbin /mscc/apps)
echo '==[ echo $PATH - updated/exported by csh ]=='
echo $PATH
echo '==[ echo $path ]=='
echo $path
echo '==[ foreach pdir ($path:q) ; echo $pdir ; end - $path is a list ]=='
foreach pdir ($path:q)
    echo $pdir
end
echo '==[ sub-process $PATH - updated PATH exported by csh automatically ]=='
perl -e 'print $ENV{PATH}."\n";'

버전 2($PATH 업데이트됨):

#!/bin/csh
echo "setting path"
setenv PATH "${PATH}:/sbin:/mscc/apps"
echo '==[ echo $PATH - exported by csh ]=='
echo $PATH
echo '==[ echo $path - updated from $PATH by csh ]=='
echo $path
echo '==[ foreach pdir ($path:q) ; echo $pdir ; end - $path is a list ]=='
foreach pdir ($path:q)
    echo $pdir
end
echo '==[ sub-process $PATH - updated PATH exported by csh automatically ]=='
perl -e 'print $ENV{PATH}."\n";'

관련 정보