항상 대화형 셸에서 실행되는 스크립트가 있다고 가정해 보겠습니다. 나는 이 스크립트가 상위의 복사본인 대화형 서브셸을 시작한 다음(즉, 모든 환경 변수 등을 유지함) 임의의 명령을 실행하기를 원합니다(구체적으로는 PS1
일부 별칭을 수정하고 정의하고 싶습니다 ). 실제 서브셸이 필요합니다(하나를 사용하는 대신 source
, 그렇지 않으면 스크립트가 완료된 후 환경 변수가 유지되지 않습니다).그리고쉘에 구애받지 않아야 합니다(예: bash, zsh 등과 함께 사용).
지금까지 내가 이 작업을 수행할 수 있었던 유일한 방법은 다음을 사용하는 것입니다 expect
. 조금 무섭지만 작동합니다.
expect <(cat <<-EXPECT
spawn $SHELL
send "export FOO=\"$foo\"\r"
send "PS1=\"(foo:$FOO) \\\$PS1\"\r"
send "alias foo=\"do_somthing --foo=$FOO\"\r"
send "clear\r"
interact
EXPECT)
더 좋은 방법이 있나요? (또한 이 접근 방식으로 인해 화면 다시 그리기 및 문자 인코딩에 문제가 발생하는 것으로 나타났습니다.)
이와 같은 작업을 수행할 때의 문제는 쉘의 전역 파일과 사용자 .rc 파일이 PS1="$foo" $SHELL
이를 덮어쓸 수 있다는 것입니다 . PS1
사용자 정의 .rc 파일을 제공하는 쉘에 구애받지 않는 방법은 없는 것 같습니다.