이것이 내가 달성하고 싶은 것입니다.
#!/bin/bash
function startBasics()
{
gnome-terminal -e "sth" &
gnome-terminal --tab -e "sth_else" &
}
function doOneThing()
{
gnome-terminal --working-directory=/myDir1/build/ -e './myExecutable1' &
}
function doAnotherThing()
{
gnome-terminal --working-directory=/myDir2/build/ -e './myExecutable2' &
}
$(startBasics)
$(doOneThing)
$(doAnotherThing)
그러나 startBasics
완료되면 다른 기능은 전혀 실행되지 않습니다. 그래서 내부에 모두 같은 위치에 놓고 startBasics
다시 시도해 보았는데 잘 되는 것 같았습니다.
그렇다면 위의 코드는 왜 작동하지 않는 걸까요? 별도의 함수를 작성하는 올바른 방법은 무엇입니까?
답변1
당신의:
$(startBasics)
말이 안되고 문제의 원인입니다. 이것은 명령 대체입니다. 출력으로 확장합니다(후행 줄 바꿈이 제거되고 인용하지 않았으므로 분할+glob이 적용됨) $(cmd)
. cmd
출력에 기초하여 명령을 작성하도록 쉘에 요청합니다 startBasics
.
startBasics
이는 쉘이 파일을 확장하기 위해 파일 끝까지 출력을 읽어야 함을 의미합니다 . 여기서의 확장은 명령을 실행하는 것으로 간주되므로 거의 의미가 없습니다.
명령 대체를 구현하기 위해 쉘은 먼저 startBasics
stdout을 파이프로 리디렉션한 다음 파이프의 다른 쪽 끝에서 읽습니다. 모든 gnome-terminal
프로세스는 이 표준 출력을 상속합니다.
쉘은 쓰기 측(모든 프로세스에서)에 열려 있는 모든 파일 설명자가 닫힌 경우 파이프의 다른 쪽 끝에서만 eof를 볼 수 있습니다. 이는 gnome-terminals
시작된 모든 것이 종료된 경우에만 startBasics
발생할 수 있습니다.
원하는 곳은 다음과 같습니다.
#!/bin/sh -
startBasics() {
gnome-terminal -e "sth" &
gnome-terminal --tab -e "sth_else" &
}
doOneThing() {
gnome-terminal --working-directory=/myDir1/build/ -e './myExecutable1' &
}
doAnoterThing() {
gnome-terminal --working-directory=/myDir2/build/ -e './myExecutable2' &
}
startBasics
doOneThing
doAnoterThing
wait # if you'd rather wait for all those processes to finish
# before exiting.
답변2
&
백그라운드에서 명령을 시작합니다 . 그래서 불평했다
startBasics가 완료된 후에는 다른 기능이 전혀 실행되지 않습니다.
이러한 다른 프로그램이 실행되고 있는 현상 때문일 수 있습니다.그리고 완료마치기 전에 startBasics
.
게다가 명령을 $( ... )
.명령으로작동합니다:
startBasics
doOneThing
doAnoterThing
하지만 어떻게 든 당신이하고 싶은 일은 다음 명령을 실행하는 것 같습니다.이내에터미널 하나하나. 이 경우 다음을 수행합니다.
gnome-terminal --working-directory=/myDir2/build/ -x /bin/sh -c 'sthe; sthelse; ./myExecutable1; ./myExecutable2'