이전 터미널을 닫지 않고 쉘 스크립트를 사용하여 여러 터미널 열기

이전 터미널을 닫지 않고 쉘 스크립트를 사용하여 여러 터미널 열기

저는 쉘 스크립팅의 초보자입니다. 스크립트를 사용하여 4개의 터미널을 열려고 합니다. 이것은 코드입니다

for i in 1 2 3 4
do
    echo $i
    if [ $i -eq 1 ]; then
        # xterm -e 
        xterm -e "source /home/akshay/openapps.sh; bash"
        opensublime
    elif [ $i -eq 2 ]; then
        xterm -e "source /home/akshay/openapps.sh; bash"
        openspark
    elif [ $i -eq 3 ]; then
        xterm -e "source /home/akshay/openapps.sh; bash"
        openpycharm
    elif [ $i -eq 4 ]; then
        xterm -e "source /home/akshay/openapps.sh; bash"
        runproject 8000
    fi

done

문제는 새 터미널을 여는 것인데 두 번째 터미널의 경우 첫 번째 터미널을 닫아야 한다는 것입니다. 다음 터미널을 열기 위해 이전 터미널을 닫지 않으려면 어떻게 해야 합니까?

완전한 코드

dpkg -s xterm  &> /dev/null
echo "Checking for Xterm"
if [ $? -eq 0 ]; then
    echo "Package  is installed!"
else
    echo "Package is not installed. Now installing package"
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install xterm
    echo "Package  is NOW installed!"
fi

for i in 1 2 3 4
    do
        echo $i
        if [ $i -eq 1 ]; then
            xterm -e "source /home/akshay/openapps.sh; bash" &
            opensublime
        elif [ $i -eq 2 ]; then
            xterm -e "source /home/akshay/openapps.sh; bash" &
            openspark
        elif [ $i -eq 3 ]; then
            xterm -e "source /home/akshay/openapps.sh; bash" &
            openpycharm
        elif [ $i -eq 4 ]; then
            xterm -e "source /home/akshay/openapps.sh; bash" &
            runproject 8000
        fi
    done

openapps.sh

function opensublime() {
  cd "/opt/Sublime Text 2"
  eval "./sublime_text"
  cd 
}
function openpycharm() {
  cd "/home/akshay/Documents/pycharm-community-2018.1.4/bin"
  eval "./pycharm.sh"
  cd 
}
function openspark(){
  cd "/opt/Spark/"
  eval "./Spark"
  cd 
}
function runproject(){
  cd "wr_workspace/corporate_admin/"
  eval "source ../env/bin/activate"
  echo "starting server on port $1"
  eval  "python manage.py runserver 127.0.0.1:$1"
  deactivate
  cd
}

답변1

명령 실행이 끝날 때까지 기다리지 않고 스크립트가 다음 명령을 계속 실행하도록 하려면 이를 &명령줄 끝에 추가하세요.

또한 루프 내에서 매번 다른 작업을 수행하려는 경우 루프가 필요하지 않습니다. 하고 싶은 일을 순서대로 나열하면 됩니다.

주석을 앞뒤로 살펴본 후 xterm이 bash먼저 openapps.sh스크립트를 가져온 다음 스크립트에 정의된 기능을 실행하는 쉘을 실행하기를 원한다는 것을 이해합니다. 따라서 다음과 같이 작동해야 합니다.

xterm -e bash -c "source /home/akshay/openapps.sh; opensublime; bash" &
xterm -e bash -c "source /home/akshay/openapps.sh; openspark; bash" &
xterm -e bash -c "source /home/akshay/openapps.sh; openpycharm; bash" &
xterm -e bash -c "source /home/akshay/openapps.sh; runproject 8000; bash" &

이 부분이 꼭 필요한지는 모르겠지만 ; bash만일을 대비해서 남겨두겠습니다.

원래 명령에 몇 가지 문제가 있습니다.

xterm -e "source /home/akshay/openapps.sh; bash" 
opensublime

이는 xterm이 명령줄을 실행하도록 지시합니다 source /home/akshay/openapps.sh; bash. 하지만 xterm이는 쉘이 아닙니다. 디스크에 있는 실제 실행 파일의 내용만 실행할 수 있습니다. sourceBourne 스타일 셸의 내부 명령이므로 실행 파일로 존재하지 않습니다.

스크립트 는 xterm 내의 인스턴스 openapps.sh에서 제공되지만 / etc bash명령은 소스가 반드시 필요하지 않은 다른 쉘 인스턴스에서 함수를 호출하려고 시도하므로 해당 명령이 실패할 수 있습니다.opensublimeopensparkopenapps.shopenapps.sh

그래서 xterm쉘을 실행 해야합니다새로운 xterm 창에서, 지정된 명령줄을 사용합니다. xterm -e bash -c "<commands>"이 방법.

해당 함수를 다른 함수와 함께 사용하려면 opensublime 해당 함수를 제공하는 동일한 셸에서 이러한 함수를 실행해야 합니다 . 그렇지 않으면 오류 메시지가 openapps.sh생성될 수 있습니다 . command not found이것이 바로 이러한 명령을 큰따옴표 안에 넣어야 하는 이유입니다.

ulimit설정 및 환경 변수는 상위 프로세스에서 비셸 하위 프로세스(이 경우)를 통해 손자 프로세스( 에서 실행 중 )로 전파 export될 수 있지만 , 셸 기능은 이러한 방식으로 전파되지 않습니다.xtermbashxterm

관련 정보