스크립트에는 기본적으로 사용자가 읽어야 하는 출력이 있습니다. 나는 이것에 대해 생각하고 있습니다 :
#!/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
조금 짜증나지만 확실합니다.