내 작업장의 제약으로 인해 이는 모든 사용자의 기본 셸이며 이를 비대화형 셸로 tcsh
사용해야 합니다 (즉, init 파일에서 프로젝트 전반에 걸쳐 대부분의 환경 구성을 수행합니다 ). 그러나 나는 그것을 대화형 셸로 사용하고 싶습니다.tcsh
tcsh
zsh
tcsh
zsh로 전환할 때 환경을 상속받기 위해 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
하지만 몇 가지 사항을 알고 싶습니다.
무너지는 방법은 없을까요?
> exec tcsh > exec zsh
주문이 되나요? 나는 이전에 시도했습니다:
> exec tcsh; zsh > exec tcsh; exec zsh
그러나 그들 중 누구도 작동하지 않는 것 같습니다. 작동하는 것처럼 보이는 유일한 것은
> exec tcsh & exec zsh
그러나 이것이 내 필요에 맞는지 확실하지 않습니다.
비대화형 환경(예:다시 로그인해도 마찬가지그런 다음
tcsh
zsh로 전환하십시오)보다 일반적으로는 대화형 작업과 비대화형 작업에 서로 다른 셸을 사용하고 다음을 확인하세요.대화형 쉘은 비대화형 쉘 환경에서 시작됩니다.? (이 환경 비트는 대화형 쉘의 초기화 파일에서 수정될 수 있습니다)
답변1
다음과 같이 2개의 exec 명령을 단일 명령으로 축소할 수 있습니다.
exec tcsh -c zsh
다음 명령을 사용하여 현재 zsh 프로세스에서 환경을 업데이트할 수 있습니다.
eval $(env -i tcsh -c env)
를 사용하면 env -i
다음 명령이 빈 환경에서 실행됩니다. 그러면 tcsh가 실행되어 시작 파일을 처리합니다. 그런 다음 tcsh 옵션의 또 다른 복사본이 -c
run 이지만 env
이번에는 명령이 없으므로 tcsh가 설정한 환경의 현재 내용만 인쇄합니다. 그러면 eval $(...)
zsh가 출력을 구문 분석하게 됩니다.
내 테스트에서 이는 zsh가 읽기 전용 변수를 env -i
포함하여 자체적으로 설정하는 환경 변수를 설정하려고 시도하는 것을 방지하는 데 필요했습니다 . _
이 시도로 인해 최소한 출력의 일부를 처리하지 못한 채 eval이 실패하게 됩니다.
답변2
스크립트 실행에는 비대화형 쉘이 사용된다고 가정합니다.
스크립트에 특별한 인터프리터가 필요하다는 것을 표현하는 가장 간단한 방법은 다음을 사용하는 것입니다.셰르본, 예를 들어 스크립트의 첫 번째 줄은 다음과 같습니다.
#!/usr/bin/tcsh