내 Arch Linux 상자에는 다음 스크립트가 있습니다.
#!/bin/bash
xterm -e "sudo pacman -Syu;bash"
그러면 xterm이 시작되고 sudo pacman -Syu
명령이 실행됩니다. 이 부분 때문에 ;bash
명령이 완료되면 xterm 창이 닫히지 않습니다. 이것은 내 시스템을 업데이트하는 데 사용되는 명령이며 출력을 보고 싶어서 시스템이 종료되는 것을 원하지 않습니다.
이것이 다른 터미널, 특히 lxterminal 및 roxterm(내가 시도한 유일한 다른 터미널)에서는 작동하지 않는 이유는 무엇입니까? lxterminal
대신 사용된 것과 roxterm
동일한 명령은 xterm
터미널을 시작하고 명령이 실행되자마자 터미널을 닫습니다.
답변1
에뮬레이터마다 기능을 열어두기 위한 기능과 프로토콜이 다릅니다. 어떤 사람들은 그것을 하지 않거나 할 수 없습니다. 다른 것들은 에뮬레이터가 계속 열려 있도록 지정하는 스크립트가 필요합니다. HDSentinel이라는 프로그램에 대한 간단한 스크립트를 작성하는 동안 이 문제가 발생했습니다. 제가 생각할 수 있는 다양한 솔루션은 다음과 같습니다.
KDE(콘솔 에뮬레이터)
konsole -hold -e sudo ./HDSentinel
( -hold
필수 매개변수입니다)
계몽(학기 시뮬레이터)
terminology --hold -e "sudo ./HDSentinel"
( --hold
필수 매개변수입니다)
XFCE(XFCE4 에뮬레이터)
xfce4-terminal -H -x "sudo ./HDSentinel"
( -H
필수 매개변수입니다.)
편집: xfce 터미널에서 -e 대신 -x를 사용하십시오.
Mate(동반 터미널 에뮬레이터)
mate-terminal --window-with-profile=HoldOpen -e "sudo ./HDSentinel"
(이 에뮬레이터를 사용하려면 먼저 에뮬레이터를 열어두기 위한 사용자 정의 구성 파일을 만들어야 합니다. HoldOpen이라고 부르겠지만 어떤 이름이든 상관없습니다)
Gnome(Gnome 터미널 에뮬레이터)
gnome-terminal --window-with-profile=HoldOpen -e "sudo ./HDSentinel"
(Mate와 동일한 방식으로 작동합니다. 프로필을 생성하여 에뮬레이터를 열어두세요)
LXDE(lx 터미널)
LXDE와 함께 제공되는 에뮬레이터는 lxterminal
터미널을 열어두는 것을 지원하지 않습니다.
따라서 결론은 일부 에뮬레이터는 열린 상태 유지를 지원하고 일부는 지원하지 않는다는 것입니다. 그렇게 하는 경우 해당 기능을 활성화하는 방법이 달라집니다. 여기에 나열되지 않은 에뮬레이터를 보고 있는 경우 해당 에뮬레이터에서 Google 검색을 수행하여 Keep-On 활성화 여부/방법을 알아내야 합니다.
사용 중인 에뮬레이터가 열린 상태 유지를 전혀 지원하지 않는 경우 배포판에 이를 지원하는 대체 에뮬레이터가 포함되어 있음을 알 수 있습니다(많은 배포판에는 xterm 및 데스크톱 버전 에뮬레이터가 포함되어 있음). 개방형 유지를 지원하는 에뮬레이터가 없는 경우 언제든지 소프트웨어 저장소에서 얻을 수 있습니다.
이 정보는 상당한 연구 시간을 의미하므로 이것이 사람들의 시간과 좌절감을 줄이는 데 도움이 되기를 바랍니다. 그건 그렇고, xterm도 이 매개변수를 사용하므로 이것이 keep-open 기능에 대한 매개변수를 제공하는 keep-open 에뮬레이터에 도움이 될 것이라고 -hold
믿습니다 . ;bash
그러나 에뮬레이터가 이 기능을 지원하지 않는 경우(lxterminal의 경우) 에뮬레이터가 열린 상태 유지 기능을 활성화하기 위해 사용자 정의 구성 파일을 사용하는 경우(예: lxterminal의 경우) 열린 상태 유지 기능을 생성하지 않습니다. Gnome), Keep-Open 기능이 활성화되지 않습니다. 기능을 켜십시오.
답변2
근본적인 문제는 VTE 기반 터미널이 동일한 방식으로 명령줄을 처리하지 않는다는 것입니다.방법xterm으로. 여기에는 옵션 유지와 관련하여 발생할 수 있는 문제(이 논의에서는 불필요함)가 포함되지 않습니다.
명령의 따옴표
xterm -e "sudo pacman -Syu;bash"
문제입니다. 인용된 문자열은 단일 인수로 xterm에 전달된 단일 토큰입니다.
xterm의 경우 다음 토큰이 먼저 -e
execv 호출에 대한 인수로 시도됩니다. 실패하면 유사한 작업을 시도합니다 "${SHELL:-sh}" -c "parameters"
(원하는 셸을 실행하여 parameters
명령줄로 해석). konsole은 이러한 작업 중 하나를 수행합니다(아마도 첫 번째 작업일 것입니다. 왜냐하면 이것이 xterm의 원래 동작이고 konsole의 디자인 대부분이 1990년대 후반으로 거슬러 올라가기 때문입니다). xterm이 luit로 수정되면 "fail" 대안은 매개변수를 luit로 전달하는 데 도움이 됩니다.
한동안 VTE 기반 터미널은 하나의 명령줄 옵션에서 한 가지 측면을 수행하고 다른 옵션에서는 다른 측면을 수행하려고 시도했습니다(제가 기억하기로는-e
그리고-x
, 하지만교환이 두 가지 옵션이 수행하는 작업은 아직 본 적이 없는 흥미로운 데비안 버그 보고서의 주제입니다. 현재 버전에서는 시도해 보세요.
gnome-terminal -e "sudo pacman -Syu;bash"
원시 xterm과 유사한 동작에서만 작동하기 때문에 실패합니다. 그리고 (다른 터미널은 이전 버전의 VTE를 사용한다는 점을 기억하십시오.) -x
gnome 터미널 개발자(VTE 개발자와 중복됨...)가 얼마 전에 해당 옵션을 포기했기 때문에 이 명령에는 이 옵션을 사용할 수 없습니다. 이것이는 원래 xterm 모델을 따르기 때문에 작동합니다.
gnome-terminal -e "bash -c \"sudo pacman -Syu;bash\""
이 -e
옵션은 최소한의 옵션 세트(헤더 옵션 포함)를 제공하려고 시도하는 쉘 스크립트를 통해 Debian에서 부분적으로 처리됩니다. 이에 대한 데비안의 정책은 1990년대 후반의 xterm을 기반으로 하며 여러 번 논의의 주제가 되었습니다.
추가 자료: