/dev/ptsに書くと〜/.bashrcを取得できますか?

/dev/ptsに書くと〜/.bashrcを取得できますか?

複数の端末ウィンドウが開いています。変更したばかりで、開いているすべての端末で実行~/.bashrcしたいと思います。source ~/.bashrc

私が見るには

source ~/.bashrc | tee /dev/pts/{0..12}

~/.bashrcすべての端末で実行する必要があります。clearの終わりにを追加したのでそうです~/.bashrc

しかし、私が具体的にテストしているのは

PROMPT_COMMAND="history -a; history -c; history -r; ${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}"

すべての端末の単一情報ソースを効果的に生成し、開いているすべての端末で変更します。

今、これが執筆に関連しているのか/dev/pts/{0..12}、それがどのように機能するのかについてはわかりませんhistory。 、git logおよび実行中の開いている端末の1つを見て、echo $PROMPT_COMMAND次のようにします。いいえ予期した修正が適用されて~/.bashrcいることを確認してください。コマンドが欠落しているため、実行中の別の端末で出力を表示できませんhistory。後で実際に修正したことを確認したいと思います。git logtail -f ~/.bash_historyPROMPT_COMMANDsource ~/.bashrc

echo $PROMPT_COMMAND | tee /dev/pts/{0..12}ただし、各端末に値が何であるかを尋ねると、次のようなPROMPT_COMMAND結果が得られます。

history -a; history -c; history -r; pre_prompt_command; echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/\~}\007"

これには、history -a; history -c; history -r;私が追加した変更が含まれます~/.bashrc

今私は混乱しました。私は何が間違っていましたか?それとも私が間違って理解しているのでしょうか?修正されましたかPROMPT_COMMAND、ダメですか?それともbash / linuxの動作方法の結果ですか?私はこれがバグではなくユーザーエラーであると確信しています。

答え1

source ~/.bashrc現在のシェルソースを作成します~/.bashrc。出力を次にリダイレクトするとtee(あなたの場合は複数のファイルに転送されます)、/dev/pts/…リダイレクトされます。出力.bashrc内容ではないのコマンドです.bashrc

ただし、これはcat ~/.bashrc | tee /dev/pts/{0..12}コンテンツを別のシェルに送信するのではなく、他のシェルのコマンドラインをecho 'source ~/.bashrc' | tee /dev/pts/{0..12}挿入することでもありません。source ~/.bashrcバラより文字列を tty に入れてコマンドを設定します。、特にこの回答:

端末は、入力デバイス(キーボードなど)とディスプレイデバイス(モニタなど)の2つの役割を果たします。端末から読むと、入力デバイスから出てくる内容が得られます。端末に書き込むと、データが表示装置に表示されます。

バイトを送信すると、/dev/pts/…ディスプレイデバイスでのみ応答が得られ、それを使用するシェル(または他のもの)では応答を取得できません。ディスプレイデバイスは通常、ユーザーが送信した内容を表示/印刷することで反応します。ただし、一部のバイトシーケンスは特別です。

clearそれは偶然作られる。出力いくつかの特殊なバイトシーケンスが原因で出力をリダイレクトして分岐すると、他の端末が画面を消去して反応します。通常、他の端末はclear順序がclear次のように変わるため、「外部」に反応する場合もあれば、反応しない場合もあります$TERMclearはい)、したがって実行中の端末に合わせて調整されましたclear

同様に、echo $PROMPT_COMMAND | tee /dev/pts/{0..12}他のシェルでは何もしません。現在、シェルが拡張されています$PROMPT_COMMAND二重引用符で囲む必要があります。)、echo結果を複数の端末にtee送信します。tee各端末印刷指定された変数値現在のシェル;他のシェルは含まれません。

一般的に言えば、Linuxでは文字列を入力したかのように挿入する簡単な(たとえば、またはなどの単純な>/dev/pts/…)方法はありません。tee /dev/pts/…プログラマは次のものを使用できます。チオクティ。ターミナルマルチプレクサとターミナルエミュレータは、自分がエミュレートするターミナルにキーストロークを送信する方法を提供できます(例:send-keysティモックス)。それにもかかわらず、命令を注入することは一般的にエレガントな方法ではありません。これは、「シェル」にbash以外のものがあるかもしれません(bashかどうかにかかわらず)、入力を消費できる他のものを実行するのに忙しいかもしれません。渡すこともできます。不要な事項に対応するには、次の手順を実行します。

また、source ~/.bashrcEnterインタラクティブなbashのコマンドラインに直接入力しても「誤動作」する可能性があります。~/.bashrcきれいなシェルに自動的に一度インポートすることを意味します。古いシェルから新しいバージョンを取得することは、新しいシェルの起動とは異なります。

関連情報