저는 쉘 스크립팅의 초보자입니다. 스크립트를 사용하여 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
이는 쉘이 아닙니다. 디스크에 있는 실제 실행 파일의 내용만 실행할 수 있습니다. source
Bourne 스타일 셸의 내부 명령이므로 실행 파일로 존재하지 않습니다.
스크립트 는 xterm 내의 인스턴스 openapps.sh
에서 제공되지만 / etc bash
명령은 소스가 반드시 필요하지 않은 다른 쉘 인스턴스에서 함수를 호출하려고 시도하므로 해당 명령이 실패할 수 있습니다.opensublime
openspark
openapps.sh
openapps.sh
그래서 xterm
쉘을 실행 해야합니다새로운 xterm 창에서, 지정된 명령줄을 사용합니다. xterm -e bash -c "<commands>"
이 방법.
해당 함수를 다른 함수와 함께 사용하려면 opensublime
해당 함수를 제공하는 동일한 셸에서 이러한 함수를 실행해야 합니다 . 그렇지 않으면 오류 메시지가 openapps.sh
생성될 수 있습니다 . command not found
이것이 바로 이러한 명령을 큰따옴표 안에 넣어야 하는 이유입니다.
ulimit
설정 및 환경 변수는 상위 프로세스에서 비셸 하위 프로세스(이 경우)를 통해 손자 프로세스( 에서 실행 중 )로 전파 export
될 수 있지만 , 셸 기능은 이러한 방식으로 전파되지 않습니다.xterm
bash
xterm