2017-01-25 1 views
0

초기 설정이 필요한 스크립트를 작성 중입니다. 설치 프로그램은 환경 변수에 많은 아티팩트가있는 csh 스크립트 형식입니다. 지금 내가 bash에서 csh를 실행할 때, bash의 서브 쉘 안의 변수는 변하지 않은 채로 남아 있습니다.bash 스크립트에서 csh 스크립트 실행

예 : I는 PATH 변수가 CSH 스크립트를 실행 한 후 변경되는 것을 볼 수있는 것이 예에서는

#!/bin/bash 
echo $PATH 
setevnvar.csh -dir $ROOT_DIR/ 
echo $PATH 

어떤 생각을 부탁드립니다 (이 결과 중 하나입니다).

+1

'csh' 스크립트 ('.sh '가 아닌'.csh'와 같은 확장자가 있어야 함)는 'bash' 스크립트에서 직접 변수를 설정할 수 없습니다. – chepner

+0

''환경 변수에 많은 유물이있는 csh 스크립트입니다. '->'csh '또는'bash '의 환경 변수? – Inian

+0

변수가 csh 내부에 설정됩니다. – YAO

답변

1

자식 프로세스에서 셸 변수를 수정할 수 없습니다. cshbash에서 실행하면 하위 프로세스가 시작되므로 수행 할 방법이 없습니다.

  • bashcsh 스크립트를 변환하고 bash 스크립트 source이 :

    옵션, 당신은.

  • 이 확인 다른 스크립트를 cshbash 스크립트를 변환하고 다시 source 확인 당신이 csh 스크립트에서 export 표시된, 어느 수도 있고하지 않을 수합니다 (csh 스크립트 내부에서 bash는 스크립트를 실행하는 필요한 변수 스크립트 (bash 또는 csh)

"소싱 하나를 가지고 두 스크립트의 코드를 병합) 사용자의 특정 요구에 대해 작동하여

  • 에서 내 물건을 돌려 "은 . 또는 (POSIX가 아닌) source 내장으로 수행됩니다. 예를 들어 :

    #!/bin/bash 
    echo $PATH 
    . setevnvar.converted_to_bash -dir "$ROOT_DIR/" 
    echo $PATH 
    

    "소싱"는 다른 파일에서 명령을 읽어들이 오히려 다른 파일을 실행하기 위해 새로운 쉘을 시작하는 것보다, 현재 스크립트의 일부인 것처럼 그들을 실행하는 현재의 프로세스가 발생합니다. 이것이 변수 할당이이 메소드에서 작동하는 이유입니다.

    공백과 같은 특수 문자가 포함될 경우 보호하기 위해 "$ROOT_DIR/" 확장에 큰 따옴표를 추가했습니다.

  • +0

    감사합니다! 그래서 두 개의 csh 스크립트가있을 경우 소스 명령이 외부 쉘에 영향을 미칩니다 (스크립트가 종료 된 후)? – YAO

    +0

    동일한 인터프리터로 실행되는 두 개의 스크립트가 있어야합니다 (원할 경우 'csh'이 될 수 있습니다). 위와 같이 스크립트를 호출하여 * 호출해야합니다. 그렇지 않은 경우 동일한 문제가 발생합니다. "소싱"을 사용하면 현재 프로세스가 다른 파일에서 명령을 읽는 대신 다른 파일을 실행하는 새 셸을 시작하지 않고 현재 스크립트의 일부인 것처럼 읽을 수 있습니다. – Fred

    +0

    'source'는 'bash'가 아닌 'csh'에서 유래했습니다. POSIX에서는 효과가 지정되지 않았습니다. – cdarke

    관련 문제