서브셸을 시작하고 명령을 실행합니다.

서브셸을 시작하고 명령을 실행합니다.

항상 대화형 셸에서 실행되는 스크립트가 있다고 가정해 보겠습니다. 나는 이 스크립트가 상위의 복사본인 대화형 서브셸을 시작한 다음(즉, 모든 환경 변수 등을 유지함) 임의의 명령을 실행하기를 원합니다(구체적으로는 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 파일을 제공하는 쉘에 구애받지 않는 방법은 없는 것 같습니다.

관련 정보