-- 옵션을 사용하여 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 -m
bash가 다음을 사용하여 초기화 파일을 가져오기 때문에 필요합니다.모니터 모드가 꺼져 있습니다^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)"