대화형 및 비대화형 작업을 위한 다양한 셸

대화형 및 비대화형 작업을 위한 다양한 셸

내 작업장의 제약으로 인해 이는 모든 사용자의 기본 셸이며 이를 비대화형 셸로 tcsh사용해야 합니다 (즉, init 파일에서 프로젝트 전반에 걸쳐 대부분의 환경 구성을 수행합니다 ). 그러나 나는 그것을 대화형 셸로 사용하고 싶습니다.tcshtcshzsh

tcshzsh로 전환할 때 환경을 상속받기 위해 zsh저는 보통 먼저 에서 대화형 셸을 시작한 tcsh다음 를 사용하여 zsh로 전환합니다 exec zsh. 이것은 잘 작동하는 것 같습니다.

tcsh그러나 때로는 초기화 파일을 업데이트 하고 그에 따라 환경을 새로 고쳐야 할 때도 있습니다.달리기에서zsh껍데기. 나는 이 문제를 해결하는 가장 좋은 방법은 tcsh소스의 init 필터로 전환한 다음 다시 전환하는 것이라고 생각합니다 zsh.

실제로 나는 다음 접근 방식을 사용합니다

> # Running from a zsh interactive shell. 
> # Various tcsh and zsh init files have been updated
> exec tcsh
> exec zsh
> # I am back to zsh with the updated environment

하지만 몇 가지 사항을 알고 싶습니다.

  1. 무너지는 방법은 없을까요?

    > exec tcsh
    > exec zsh
    

    주문이 되나요? 나는 이전에 시도했습니다:

    > exec tcsh; zsh
    > exec tcsh; exec zsh
    

    그러나 그들 중 누구도 작동하지 않는 것 같습니다. 작동하는 것처럼 보이는 유일한 것은

    > exec tcsh & exec zsh
    

    그러나 이것이 내 필요에 맞는지 확실하지 않습니다.

  2. 비대화형 환경(예:다시 로그인해도 마찬가지그런 다음 tcshzsh로 전환하십시오)

  3. 보다 일반적으로는 대화형 작업과 비대화형 작업에 서로 다른 셸을 사용하고 다음을 확인하세요.대화형 쉘은 비대화형 쉘 환경에서 시작됩니다.? (이 환경 비트는 대화형 쉘의 초기화 파일에서 수정될 수 있습니다)

답변1

다음과 같이 2개의 exec 명령을 단일 명령으로 축소할 수 있습니다.

exec tcsh -c zsh

다음 명령을 사용하여 현재 zsh 프로세스에서 환경을 업데이트할 수 있습니다.

eval $(env -i tcsh -c env)

를 사용하면 env -i다음 명령이 빈 환경에서 실행됩니다. 그러면 tcsh가 실행되어 시작 파일을 처리합니다. 그런 다음 tcsh 옵션의 또 다른 복사본이 -crun 이지만 env이번에는 명령이 없으므로 tcsh가 설정한 환경의 현재 내용만 인쇄합니다. 그러면 eval $(...)zsh가 출력을 구문 분석하게 됩니다.

내 테스트에서 이는 zsh가 읽기 전용 변수를 env -i포함하여 자체적으로 설정하는 환경 변수를 설정하려고 시도하는 것을 방지하는 데 필요했습니다 . _이 시도로 인해 최소한 출력의 일부를 처리하지 못한 채 eval이 실패하게 됩니다.

답변2

스크립트 실행에는 비대화형 쉘이 사용된다고 가정합니다.

스크립트에 특별한 인터프리터가 필요하다는 것을 표현하는 가장 간단한 방법은 다음을 사용하는 것입니다.셰르본, 예를 들어 스크립트의 첫 번째 줄은 다음과 같습니다.

#!/usr/bin/tcsh

관련 정보