다음과 같이 구성된 일반 쉘 csh 명령 스크립트가 있습니다. 새 터미널을 생성하고 후속 명령을 실행하고 싶습니다.존재하다새로운 쉘이 생성되었습니다.
xterm&;
sourcemyscript.scr;fred;runtool&;
xterm & ;source myscript.scr; 도구 실행 &
term1이라는 csh 용어로 스크립트를 실행하고 있습니다. 따라서 첫 번째 부분은 새 터미널 term2를 열고 새로 열린 터미널 term2에서 다음 몇 가지 명령을 실행하는 것입니다. 그런 다음 원래 term1 터미널의 다른 터미널도 필요하고 이 새 터미널에서 다른 명령을 실행합니다(예: term3).
새 터미널 term2가 생성되었지만 후속 명령이 새 터미널 term2가 아닌 원래 터미널 term1에서 실행되는 것을 발견했습니다.
후속 명령이 실행을 위해 새 셸 fof로 "이동"되었는지 확인할 수 있는 방법을 제안해 주시겠습니까? 또한 돌아가서 새 터미널을 실행해야 한다는 점에도 유의하시기 바랍니다.
답변1
사용:
xterm -e "myscript.scr; cd fred; run _tool" &
xterm -e "source myscript.scr; cd bull; run_tool" &
스위치는 -e
지정된 명령을 실행합니다이내에xterm
대신에 회의뒤쪽에당신의 예가 바로 그 일을 합니다.
매뉴얼 페이지에서:
-e 프로그램 [매개변수...]
이 옵션은 xterm 창에서 실행될 프로그램(및 해당 명령줄 인수)을 지정합니다. -T 및 -n이 명령줄에 제공되지 않으면 창 제목과 아이콘 이름도 실행 프로그램의 기본 이름으로 설정됩니다. 이는 명령줄의 마지막 옵션이어야 합니다.
답변2
내 생각에 당신이 원하는 것은 이것이다.
xterm &
(source myscript.scr; cd fred; run_tool ) &
이 경우 첫 번째 명령은 현재 셸 세션에서 실행되고 백그라운드로 푸시됩니다. 두 번째 명령은 현재 세션에서 생성된 새 세션에서 실행되며 백그라운드에서도 실행됩니다.
그러나 귀하의 질문에 "터미널"과 "셸"을 사용하여 약간 혼란스러워졌습니다. 새로운 대화형 터미널 창을 로드하려고 하시나요? 아니면 현재 쉘 세션에 영향을 주지 않고 명령을 실행하시겠습니까?
내 작업이 현재 세션에 영향을 미치지 않도록 하기 위해 일반적으로 다음을 수행합니다.
for my_dir in $some_list_of_dirs; do
(
cd "$my_dir"
do stuff
)
done
이렇게 하면 작업 디렉터리가 기본 세션에서 변경되지 않고 하위 세션에서만 변경되며 하위 세션에서 환경에 대한 변경 사항이 기본 세션에 전파되지 않습니다.