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