개방형 터미널에서 노틸러스에서 시작된 스크립트 실행

개방형 터미널에서 노틸러스에서 시작된 스크립트 실행

스크립트에는 기본적으로 사용자가 읽어야 하는 출력이 있습니다. 나는 이것에 대해 생각하고 있습니다 :

#!/bin/bash

#cd to the script dir if executed from outside
SCRIPT_PATH=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_PATH"
if [ ! -t 1 ]; then #not from terminal
    SCRIPT=$(basename "$(readlink -f "$0")")
    x-terminal-emulator --profile "$USER" --working-directory "$SCRIPT_PATH" -e "./$SCRIPT" &
    exit 0
fi

echo "output"

#keep terminal open
bash

그러나 문제가 있습니다. 새 터미널(노틸러스에서 실행될 때 pgrep은 bash 프로세스가 하나만 있음을 의미) 또는 "이전" 터미널(이미 열려 있는 터미널에서 실행될 때 pgrep은 의미)의 창을 닫으려고 하면 문제가 있습니다.bash 프로세스), "이 터미널에서 아직 실행 중인 프로세스가 있습니다. 터미널을 닫으면 프로세스가 종료됩니다."

저는 완전한 솔루션을 찾고 있습니다. 개방형 터미널에서 실행할 수 있고, 노틸러스 또는 다른 파일 관리자에서 실행할 수 있으며, 항상 사용자가 출력을 읽을 수 있도록 허용하고, 종료 시 프로세스를 중단하지 않고, 실수로 사용자에게 경고 창이 닫힙니다.

콘솔을 표시하는 "프로세스"가 마지막 줄이라고 확신 bash하지만 bash는 스크립트가 노틸러스에서 실행되는 경우 에코를 볼 수 있는 유일한 것입니다.

답변1

약간 개선됨: trap종료 시 메시지를 표시하는 데 사용됩니다.

# some scripts like are meant to be run by clicking on
# them in the file manager.  This function runs the script in an X
# terminal if it isn't in a terminal already.
run_in_terminal() {
    # run in a new terminal if not already
    if [ ! "${RUNNING_IN_TERMINAL:-}" -a ! -t 1 -a "${DISPLAY:-}" ]; then
        RUNNING_IN_TERMINAL=1 exec x-terminal-emulator -e "$@"
    fi

    # wait for prompt to close the terminal
    if [ "${RUNNING_IN_TERMINAL:-}" ]; then
        exit_prompt() {
            echo
            read -p "Finished.  Press any key to close..." -n 1
        }
        trap exit_prompt EXIT 
    fi
}

run_in_terminal "$0" "$@"

답변2

다음을 수행하여 이 문제를 해결할 수 있습니다.

SCRIPT_PATH=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_PATH"
if [ ! -t 1 ]; then #not from terminal
    SCRIPT=$(basename "$(readlink -f "$0")")
    SUBPROC=1 x-terminal-emulator --profile "$USER" --working-directory "$SCRIPT_PATH" -e "./$SCRIPT" &
    exit 0    
fi
echo "output"
...
[[ -v SUBPROC ]] && read -p "Press any key to exit" -n1 junk

조금 짜증나지만 확실합니다.

관련 정보