私の初期のアプローチが間違っている理由

私の初期のアプローチが間違っている理由

私は新しいターミナルウィンドウ(この場合は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";

新しく開いた 2 つの端末に同じエラーが表示されます。

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

明らかにbashインタプリタはタイトル設定機能を見つけることができませんでしたが、強制的にロードする方法がわかりません。.bashrcGNOME端末を開くときのファイルです。

答え1

私は自分の質問に答えますが、私が見つけた2つの解決策を説明する前に、なぜ私がしたいことがうまくいかないのかを説明します。

私の初期のアプローチが間違っている理由

システムにカスタム機能がある場合~/.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ウィンドウシステムで人間の相互作用をシミュレート/自動化するためのコマンドラインツールを使用することですxdotoolxdotool

sleepこのソリューションはbashスクリプトとX Windowsシステム間の同期などの他の問題を生成するため、元の問題を過度に設計してXウィンドウマネージャがイベントを処理する時間を提供するためにbashスクリプトにコマンドを導入する必要があります。この同期の問題により、このソリューションは100%動作せず、省電力時間をWindowsシステムの速度に合わせて調整する必要があるため、このソリューションを信頼できなくなります。

私は質問にさらされた問題に対してこのソリューションをお勧めしませんが、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

関連情報