쉘 스크립트에서 실행 가능한 호출을 다른 기능으로 분리하는 방법은 무엇입니까?

쉘 스크립트에서 실행 가능한 호출을 다른 기능으로 분리하는 방법은 무엇입니까?

이것이 내가 달성하고 싶은 것입니다.

#!/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이는 쉘이 파일을 확장하기 위해 파일 끝까지 출력을 읽어야 함을 의미합니다 . 여기서의 확장은 명령을 실행하는 것으로 간주되므로 거의 의미가 없습니다.

명령 대체를 구현하기 위해 쉘은 먼저 startBasicsstdout을 파이프로 리디렉션한 다음 파이프의 다른 쪽 끝에서 읽습니다. 모든 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'

바라보다https://superuser.com/questions/198015/open-gnome-terminal-programmatically-and-execute-commands-after-bashrc-was-execu

관련 정보