gnome-terminal - 일시정지 기능으로 명령 실행

gnome-terminal - 일시정지 기능으로 명령 실행

-- 옵션을 사용하여 gnome-terminal 내에서 명령을 실행하는 응용 프로그램 실행 프로그램이 있지만 터미널로 이동하여 crtl-z를 사용하여 명령을 일시 중단하고 백그라운드로 이동하려고 할 때마다 아무 일도 일어나지 않습니다. 내 검색에서 bash에서 대화형 셸을 시작하는 방법에 대한 많은 게시물이 나타났지만 거기에서 시도한 것은 아무것도 작동하지 않았습니다. gnome-terminal을 시작하고 명령을 일시 중지하고 나중에 프롬프트를 표시할 수 있는 명령을 실행할 수 있는 방법이 있습니까?

답변1

bash_in_gnome_terminal(){
    local IFS
    printf -v cmd %q ". ~/.bashrc; set -m; $*"
    gnome-terminal -- bash -c "bash --rcfile <(echo $cmd)"
}

bash_in_gnome_terminal tail -f ~/.xsession-errors
bash_in_gnome_terminal 'grep -r pattern dir | less'

gnome-terminal명령이 실제로 터미널 인스턴스를 생성하기 위해 "터미널 서버"를 호출하고 여기서 실행 중인 프로세스에 파일 설명자를 전달할 수 없기 때문에 솔루션은 복잡하고 심각합니다 .

xterm또는 같은 다른 터미널의 경우 mlterm솔루션이 더 간단하고 실용적입니다.

bash_in_xterm(){
    local IFS
    xterm -e bash --rcfile <(printf '. ~/.bashrc; set -m; %s\n' "$*")
}

vi +'cmd'또한 bash가 이와 같은 것을 함께 엮을 필요 없이 대화식 쉘 이전에 일부 명령을 실행할 수 있는 옵션이 있다면 좋을 것입니다 --rcfile <(...). 어쩌면 그럴 수도 있습니다. 하지만 알아낼 수는 없습니다 ;-)

이는 set -mbash가 다음을 사용하여 초기화 파일을 가져오기 때문에 필요합니다.모니터 모드가 꺼져 있습니다^Z즉, 작업 제어가 없으며 등을 사용할 가능성이 없습니다 fg.bg


시작된 명령이 종료될 때 쉘을 종료하고 터미널을 닫으려면 다음과 같이 기능을 수정할 수 있습니다(최신 버전의 bash를 가정).

bash_in_gnome_terminal(){
    local IFS
    set -- 'sigchld(){ local j="\j"; ((${j@P})) || exit; }; trap sigchld CHLD;' "$@"
    printf -v cmd %q ". ~/.bashrc; set -m; $*"
    gnome-terminal -- bash -c "bash --rcfile <(echo $cmd)"
}

양식 ${var@P}은 모든 프롬프트 이스케이프를 확장 var하고 \j프롬프트 이스케이프는 작업 번호로 확장됩니다. 더 이상 작업이 없으면 트랩에서 호출된 명령이 쉘을 종료합니다 j="\j"; ((${j@P})) || exit.CHLD

확장 형식을 지원하지 않는 이전 버전의 bash에서는 ${var@P}더 번거로운 kludge를 사용해야 합니다.

set -- 'sigchld(){ trap - CHLD; test "$(jobs -p)" || exit; trap sigchld CHLD; }; trap sigchld CHLD;' "$@"

여기서 CHLD트랩을 비활성화했다가 다시 활성화해야 합니다 . 그렇지 않으면 $(jobs -p)명령 대체가 트랩을 반복적으로 트리거합니다.


모든 것을 함수 대신 독립형 스크립트로 만들 수 있습니다.

#! /bin/bash

# uncomment and edit the following line accordingly
# set -- <fixed command and arguments> "$@"

# this only works in bash >= 4.4
# set -- 'sigchld(){ local j="\j"; ((${j@P})) || exit; }; trap sigchld CHLD;' "$@"
set -- 'sigchld(){ trap - CHLD; test "$(jobs -p)" || exit; trap sigchld CHLD; }; trap sigchld CHLD;' "$@"

printf -v cmd %q ". ~/.bashrc; set -m; $*"
gnome-terminal -- bash -c "bash --rcfile <(echo $cmd)"

관련 정보