스크립트에서 새 터미널(모든) 창 생성

스크립트에서 새 터미널(모든) 창 생성

htop현재 터미널을 감지하고 쉘 명령(예:)을 사용하여 백그라운드에서 새 터미널 창을 생성하는 스크립트를 실행하고 싶습니다.

명령줄에서 원하는 결과를 얻었습니다.

cterminal="$(ps -p $(ps -p $$ -o ppid=) o args=)"  
$(echo $cterminal -e "htop")&  

모든 터미널에서 작동합니다. 하지만 스크립트에서는 그렇지 않습니다.

#!/bin/bash  
cterminal="$(ps -p $(ps -p $$ -o ppid=) o args=)"  
echo $cterminal  
"$cterminal" -e "htop" &  

현재 스크립트 출력:

$ bash script.sh
/bin/bash  
$ /usr/bin/htop: /usr/bin/htop: cannot execute binary file

어떤 팁이 있나요?

답변1

귀하의 ps명령은 상위 프로세스의 PID(PPID)를 인쇄하고 있습니다. 터미널 에뮬레이터를 실행하면 $$(현재 프로세스의 PID)가 셸 세션을 가리키고 해당 PPID는 이를 시작한 터미널 에뮬레이터가 됩니다.

스크립트는 자체 환경에서 실행됩니다.서브쉘. 이는 스크립트의 상위 프로세스가 이를 시작한 쉘임을 의미합니다. 따라서 명령을 실행하면 xterm -e htop실행 되지 않습니다 bash xterm -e htop. 표시하려면:

$ bash top  
/sbin/top: /sbin/top: cannot execute binary file

echo $(echo $cterminal -e "htop")스크립트와 명령줄에서 실행하여 이를 테스트 할 수 있습니다 .

GUI 터미널 에뮬레이터에서 스크립트를 실행하려면 PPID의 PPID를 사용할 수 있습니다.

cterminal="$(ps -p $(ps -p $PPID -o ppid=) o args=)"  

$(echo ...)마지막으로 명령을 실행하는 데 사용하지 말고 다음을 실행하세요.

#!/usr/bin/env bash
$(ps -p $(ps -p $PPID -o ppid=) o args=) -e top

관련 정보