bash 스크립트를 실행 한 후 터미널 종료


18

명령을 bash사용하여 특정 파일 (주로 pdf 파일)을 여는 스크립트 를 작성하려고합니다 gnome-open. 또한 pdf 파일을 열면 터미널을 종료하고 싶습니다.

exit터미널 끝에 닫히지 않는 스크립트 끝에 추가하려고했습니다 . 나는 내 질문에 대한 답변을 온라인으로 검색하려고 시도했지만 적절한 것을 찾을 수 없었습니다. 여러분이 도울 수 있다면 정말 감사하겠습니다.

명령을 실행하는 터미널 만 죽이는 대답이 필요합니다. 모든 터미널이 가능하지는 않습니까? 내가 받아 들인 이전 답변은 열려있는 모든 터미널 창을 죽입니다. 나는 오늘까지 이것이 사실임을 몰랐다.


처음에 터미널에서 스크립트를 실행하고 있습니까? 엄격히 명령 줄에서 터미널을 열 필요가 없습니다.
Jacob Vlijm

예, 터미널에서 스크립트를 실행합니다. 나는 터미널과 커맨드 라인 사이에 차이가 있다는 것을 몰랐다
Rumesh

나는 교체 gnome-open과를 xdg-open내 스크립트에 있지만 변화가 없다. 터미널은 여전히 ​​열려 있습니다
Rumesh

@Tim Wow, 그것은 작동합니다 =) +1
AB

@Tim 그러나 내 솔루션도 나쁘지 않았습니다. ;)
AB

답변:


12

당신이하지 않는있는 거 개방 한 파일이 있다면 정말 스크립트가 연속으로 여러 명령을 실행하는 쉬운 방법이 될하기위한 것입니다 때문에 두 명령을 실행할 필요가 여기에있는 동안, 스크립트를 사용할 필요가 (포함 exit) .

exit명령 또는 명령 체인 이후 에 실행하려는 경우 &&연산자 를 사용하여 (이전 명령 / 명령 체인이 성공하면 다음 명령을 실행 함) 또는 ;연산자 (이전 명령 / 명령 체인의 성공 및 실패시 다음 명령을 실행 함).

이 경우 다음과 같습니다.

gnome-open <path_to_pdf_file> && exit

* <path_to_pfd_file> = pdf 파일의 경로

exit스크립트의 끝에 배치 bash하면 스크립트가 실행되는 bash인스턴스 (터미널의 내부 bash인스턴스가 아닌 다른 인스턴스)를 종료하기 때문에 작동하지 않습니다 .

어쨌든 스크립트를 사용하려면 가장 간단한 방법은 다음과 같이 스크립트를 호출하는 것입니다.

<path_to_script> && exit

또는 스크립트가 다음과 같이 터미널의 현재 작업 디렉토리에있는 경우 :

./<script> && exit

당신이 경우 정말 할 수 없어 / 싶지 않아, 두 번째 가장 간단한 방법은 스크립트의 마지막에이 줄을 추가하는 것입니다 :

kill -9 $PPID

그러면 SIGKILL스크립트의 상위 프로세스 ( bash터미널에 연결된 인스턴스)에 신호 가 전송됩니다 . 하나의 bash인스턴스 만 터미널에 연결되어 있으면 해당 인스턴스가 종료되면 터미널 자체가 종료됩니다. 여러 bash인스턴스가 터미널에 연결되어 있어도 종료 되어도 터미널이 닫히지 않습니다.


2
SIGTERM 신호는 프로세스를 종료하여 종료를 요청합니다. SIGKILL 신호와 달리 프로세스에서 신호를 포착하고 해석하거나 무시할 수 있습니다. 이를 통해 프로세스는 자원을 해제하고 적절한 경우 상태를 저장하는 훌륭한 종료를 수행 할 수 있습니다. SIGINT는 SIGTERM과 거의 동일합니다.
AB

@AB 당신이 맞아요, SIGTERM여기 충분하지 않습니다.
kos

답장을 보내 주셔서 감사합니다. 나는 당신이 당신의 대답에 준 단일 명령을 사용하는 것 같아요
Rumesh

kill $ PPID는 exit와 동일하게 작동합니다. kill -9 $ PPID는 부모와 함께 모든 자식 창을 닫습니다.
SDsolar

5

이 스크립트는 터미널과 셸 및 자신을 종료합니다.

모든 프로세스를 무자비하게 죽입니다. 터미널에 여러 개의 탭이 열려 있으면 탭도 닫힙니다.

문제는 여러 터미널이 열려 있고 이것의 자식 프로세스 인 gnome-terminal-server경우 모든 터미널이 종료된다는 것입니다.

이 경우 스크립트는 독립 터미널에서 시작해야합니다. 예 : xterm

<your_command> & disown

PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID
  • PPID

    PPID는 상위 프로세스 ID이며이 경우 쉘 ( e.g. /bin/bash)

  • PPPID

    PPPID는 PPID의 상위 프로세스 ID이며이 경우 터미널 창입니다.

  • <your_command> & disown

    bash 쉘에서 disown builtin 명령은 작업 테이블에서 작업을 제거하거나 상위 쉘이 수신 할 때 (예 : 사용자가 로그 아웃하는 경우) SIGHUP 신호가 작업에 전송되지 않도록 작업을 표시하는 데 사용됩니다.

  • awk '{print $4}' "/proc/$PPID/stat"

    파일의 네 번째 열의 값을 가져옵니다 /proc/$PPID/stat(예 : /proc/1/stat0을 반환)


$$ 명령이 터미널의 pid라고 생각합니다. 그 대안이 되겠습니까? 폐기하는 방법도 설명해 주시겠습니까?
Tim

이 스크립트는 어떻게합니까? 저는 여전히 쉘 스크립팅을 처음 사용하므로 이러한 명령을 실제로 이해할 수 없습니다. 터미널을 닫는 방법을 설명해 주시겠습니까?
Rumesh

1
@Tim 아니오, 터미널에서 쉘을 반환합니다 : ps xa | grep $$=> 4381 pts/0 Ss 0:01 /usr/bin/zsh
AB

1
@RumeshSudhaharan 스크립트가 시작된 전체 터미널 창을 종료하지만 다른 터미널 창은 종료하지 않습니다.
AB

3
@AB 이전에 이것은 현재 터미널 창만 죽이고 다른 터미널 창은 죽이지 않는다고 말했습니다. 나는 오늘이 스크립트를 두 개의 터미널 창을 연 상태에서 사용했으며 스크립트를 실행하면 둘 다 죽었습니다.
Rumesh

4

사용할 수 있습니다 .exec ./your-script

그놈 터미널과 같은 터미널 에뮬레이터는 내부에서 실행되는 초기 프로세스 (일반적으로 쉘)가 종료되면 종료됩니다.

이미 터미널에 있고 터미널을 종료하기 전에 수행하려는 유일한 작업이 특정 스크립트 (또는 프로그램)를 실행하는 것이라면 더 이상 더 이상 실행되는 쉘이 더 이상 필요하지 않습니다. 따라서 쉘의 exec내장 기능을 사용하여 쉘이 명령으로 작성된 프로세스로 교체 되도록 할 수 있습니다 .

  • 스크립트의 경우 다른 쉘 프로세스입니다.- 없이 스크립트를 실행할 때 두 번째 쉘 프로세스가 작성되는 방식과 같습니다 exec.

구문은 예를 들어 입니다.exec commandexec ./your-script

exec: 예

예를 들어,이라고 불리는 count실행 파일로 표시되고 현재 디렉토리에 쉘 스크립트가 있다고 가정하십시오 . 그것은 포함합니다 :

#!/usr/bin/env bash
for i in {5..1}; do echo $i; sleep 1; done

그리고 터미널에서 다음을 실행합니다.

exec ./count

이 번호가 인쇄 5, 4, 3, 2, 및 1초당 한 후 단자 창 닫는다.

예를 들어, bash다른 쉘 인스턴스를 시작하기 위해 처음 실행 한 경우와 같이 터미널에서 실행 된 첫 번째 프로세스가 아닌 다른 프로세스에서이를 실행 하면 터미널을 종료하지 않고 해당 프로세스 를 작성한 쉘로 돌아갑니다 . 이 경고는 exit기반 방법에 동일하게 적용됩니다 .

사용할 수 있습니다 ../your-script; exit

셸을 통해 새 프로세스로 교체하도록하고 싶지 않다면 (쉘을 통해 exec), 새 프로세스가 완료된 후 즉시 종료되도록 할 수 있습니다.

이렇게하려면 명령과 exit명령을 구분하여 구분하여 ;한 줄에 제공 할 수 있습니다.

구문은 command; exit예를 들어 입니다../your-script; exit

command; exit vs. command && exit

이것은 kosheemayl의 대답 에서 제안 된 방법 과 비슷하게 보일 수 있습니다 . 차이점은 다음과 같습니다../your-script && exit

  • &&첫 번째 명령 이 종료 코드 0을 리턴하여 성공했다고보고 한 경우에만 두 번째 명령을 실행합니다 .
  • ; 첫 번째 명령이 성공을보고했는지 여부에 관계없이 두 번째 명령을 실행합니다.

원하는 상황은 특정 상황에 따라 다릅니다. 명령이 실패하면 호출 쉘 (및 호스팅 터미널)을 그대로 유지 하시겠습니까? 그렇다면 &&; 그렇지 않은 경우을 사용하십시오 ;.

또한 실패 가보고 된 command || exit경우에만 호출 쉘을 종료합니다 .command


2

스크립트를 실행하지 않고 소스를 얻을 수 있습니다. 예 :

$ cat run.sh
exit;
$ ./run.sh #will not close
$ . ./run.sh # will close

1

개인적으로 나는 서브 쉘에서 pdf 또는 다른 파일을 여는 명령을 실행하고 파일을 열기 위해 지연을 둔 다음 종료합니다. 기본적으로 여기에 내가 테스트 한 것이 있습니다.(nohup gnome-open *.pdf &); sleep 2; exit

이것에 대한 변형은 nohup gnome-open *.pdf && sleep 2 && exit


제 경우 nohup에는 끊기 신호를 무시하고 nohup xdg-open some_program저를 위해 일했으며 필요하지 exit않았습니다. nohup메시지를 nohup.out파일로 리디렉션 :nohup: ignoring input and appending output to nohup.out
nick indiessance

0

가장 간단한 해결책은 다음과 같습니다.

xdg-open file.pdf && exit

nohup명령을 무시하는 데 다른 유사한 명령 이 필요하지 않은 SIGHUP이유 xdg-open는 pdf 파일을 여는 데 선호되는 응용 프로그램 인 하위 프로세스 생성을 종료 하는 이유 입니다. 터미널에서 시작된 실제 프로세스가 더 이상 종료 nohup되지 않으므로 필요하지 않습니다.

&&는 이전 명령이 성공한 경우 다음 명령이 실행됨을 나타냅니다. 즉, 종료 코드 0( $?=0)를 반환 exit하고 터미널을 닫습니다.


나는 그가 출구가 작동하지 않았다고 생각했다.
Tim Tim

@Tim : 아마도 OP는 올바른 방법을 사용하지 않았을 것입니다. 그 질문에서 나에게 어떻게 exit끝까지
넣었고

1
@Tim OP가 exit스크립트에 삽입 되었기 때문에 bash스크립트가 실행되고 있는 인스턴스 를 종료하는 것은 부모 bash인스턴스 (터미널에 연결된 인스턴스)가 아닌 종료하는 효과 가 있으므로 터미널이 닫히게됩니다.
kos

1
어쨌든 xdg-open이미 백그라운드에서 실행되고 터미널에서 연결이 해제되어 있으므로 nohup여기에서 필요하지 않으며 xdg-open스크립트 내부에서 OP를 여러 번 실행 하여 스크립트 내에서 여러 파일을 일괄 열려면 이해해야 xdg-open합니다. 첫 xdg-open발생 에서 종료
kos

@kos : 아니, 난 실행하고 있지 않다 xdg-open내가 가진 경우에도, 배경에 nohup다른 이유입니다 및 상위 터미널을 죽일 때 죽을 것 원래 터미널에서 there..any 백그라운드 프로세스해야합니다 .. nohup거기에 방지하는 것입니다 터미널을 대화식으로 다시 사용할 필요가 없으므로 xdg-open && exit서브 쉘에서 각각 실행하여 방지 할 수있는 두 번째 지점에 bg ..에 프로세스를 넣을 필요가 없습니다 ..
heemayl

0

제목 질문에 명시 적으로 답변하려면

"bash 스크립트를 실행 한 후 터미널을 종료하십시오" :

터미널에서 스크립트 만 실행

스크립트가 수행하는 세부 사항을 보지 않고도 쉘을 시작하지 않고 옵션 -e( --command)을 사용하여 터미널 내에서 스크립트를 직접 실행할 수 있습니다 . 쉘 대신 다음과 같이 사용됩니다.

gnome-terminal -e ./script.sh

스크립트에 인수를 제공 하려면 옵션 -x( --execute)을 사용하십시오 . 이를 통해 명령 행의 나머지 부분 만 명령 및 인수로 간주합니다.

gnome-terminal -x ./script.sh foo bar

스크립트가 종료되면 사용자 입력을 기다릴 수있는 대화식 쉘이 없습니다.

teminal은 명령이 실행 된 후에 종료됩니다. 이와 같이 sleep쉘없이 4 초 후에 닫힙니다.

gnome-terminal -x sleep 4

물론 스크립트가 다른 쉘 인스턴스를 사용하고 있기 때문에 쉘 스크립팅을 계속 사용할 수 있습니다.

또한 명시 적 스크립트를 사용하여 쉘을 실행할 수 있습니다. 대화식이 아닙니다.

gnome-terminal -x bash -c "echo 'Hello!'; sleep 4"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.