내 초기 접근 방식이 잘못된 이유

내 초기 접근 방식이 잘못된 이유

저는 새 터미널 창(이 경우에는 gnome 터미널)을 여는 척하고 일부 명령을 실행하며 터미널 창의 제목을 변경하는 bash 스크립트를 작성하고 있습니다.

터미널 창의 제목을 변경하기 위해 다음 기능을 사용하고 있습니다.제목 설정제안대로이 답변. 이것은 수동으로 새 터미널을 열고 터미널 내에 입력할 때 완벽하게 작동합니다.제목 설정 MY_TITLE. 하지만 이 경우 bash 스크립트에서는 작동하지 않습니다.원천이것.bashrc문서.

#!/bin/bash

gnome-terminal -- /bin/bash -c "echo Hello from terminal 1; set-title Terminal 1; exec /bin/bash";

gnome-terminal -- /bin/bash -c "source ~/.bashrc; echo Hello from terminal 2; set-title Terminal 2; exec /bin/bash";

새로 열린 두 개의 터미널에 동일한 오류가 표시됩니다.

/bin/bash: set-title: command not found

분명히 bash 인터프리터는 제목 설정 기능을 찾지 못했지만 강제로 로드하는 방법을 모르겠습니다..bashrc그놈 터미널을 열 때 파일입니다.

답변1

나는 내 자신의 질문에 답할 것이지만 내가 찾은 두 가지 해결책을 설명하기 전에 내가하려는 일이 왜 효과가 없는지 설명하겠습니다.

내 초기 접근 방식이 잘못된 이유

시스템에 사용자 정의 기능이 있는 경우~/.bashrc내 예의 파일과 같은 파일터미널 창 제목 설정, 이러한 기능은 자동화된 방식으로 명령을 실행하는 bash 스크립트에서 열린 터미널 창에서 사용할 수 없습니다(내 질문의 예에서와 같이).

감사해요사용자 414777힌트로. 너가 확실히 맞아. 내 ~/.bashrc 파일의 시작 부분에는 다음 코드가 포함되어 있습니다.

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

옵션 플래그를 인쇄하면 $-결과는 다음과 같습니다.HB(예상대로 이것은 대화형 쉘이 아닙니다.) 따라서 분명히 set-title마지막에 있는 기능은~/.bashrc는 쉘에 추가되지 않습니다.

해결 방법 1(권장): xfce4-terminal 사용

~처럼Xue Dijie의 호기심이것이 문제를 해결하는 가장 쉬운 방법인 것이 좋습니다. (내 경우처럼) Gnome을 사용하고 기본적으로 gnome-terminal을 사용하는 경우 다른 터미널 도구를 설치하고 싶지 않을 수도 있지만 좋은 점은 xfce4-terminalbash 스크립트와 gnome-terminal"인간-컴퓨터" 상호 작용을 사용할 수 있다는 것입니다. 제목 외에도 추가 분류 수준을 사용할 수도 있습니다(여러 터미널 창이 열려 있는 경우).

작동 방식 xfce4-terminal은 bash 스크립트와 약간 다르지만 gnome-terminal실제로 알아낼 수 없는 것은 없습니다. 어쨌든 아래에서 해결책을 찾을 수 있습니다 xfce4-terminal.

#!/bin/bash

xfce4-terminal --title "Terminal 1" -e "bash -c 'echo Hello from terminal 1; exec /bin/bash'" &

xfce4-terminal --title "Terminal 2" -e "bash -c 'echo Hello from terminal 2; exec /bin/bash'" &

해결 방법 2: xdotool 사용

이 문제에 대해 제가 찾은 또 다른 해결책은 X11 윈도우 시스템에서 인간 상호 작용을 시뮬레이션/자동화할 수 있는 명령줄 도구를 사용하는 것입니다 xdotool.xdotool

sleep이 솔루션은 bash 스크립트와 X Windows 시스템 간의 동기화와 같은 다른 문제를 생성하므로 원래 문제를 과도하게 설계하여 X 창 관리자가 이벤트를 처리할 시간을 제공하기 위해 bash 스크립트에 명령을 도입 해야 합니다 . 이러한 동기화 문제로 인해 이 솔루션은 100% 작동하지 않고 절전 시간을 윈도우 시스템 속도에 맞게 조정해야 하므로 이 솔루션을 신뢰할 수 없게 됩니다.

질문에 노출된 문제에 대해 이 솔루션을 권장하지는 않지만 Flutter 무결성을 위해 답변에 포함하기로 결정했습니다. 다른 사람들은 이 방법을 다른 목적에 적용하는 것이 유용할 수도 있습니다.

#!/bin/bash

function set-title(){
    sleep 0.2
    
    # local WINDOW_ID=`xdotool getactivewindow`
    # local P_ID=`xdotool getactivewindow getwindowpid`
    # echo "the window id is: $WINDOW_ID with PID: $P_ID"

    xdotool type "set-title $@"
    xdotool key KP_Enter
    sleep 0.2
}


gnome-terminal -- /bin/bash -c "echo Hello from terminal 1;echo $-; exec /bin/bash";
# xdotool search --onlyvisible --class 'gnome-terminal'
set-title "Terminal 1"


gnome-terminal -- /bin/bash -c "echo Hello from terminal 2; exec /bin/bash";
# xdotool search --onlyvisible --class 'gnome-terminal'
set-title "Terminal 2"

이 경우 함수는 set-title다음에 포함됩니다.~/.bashrc에서 명령을 실행한 후 gnome-terminal마지막 명령이 이기 때문에 파일이 작동합니다 /bin/bash. 셸을 다시 로드하고 이벤트를 사용하여 다음 명령을 터미널에 전달합니다 xdotool.

관련 정보