すべての端末出力を保存したいです。一部のターミナルセッションで "script"コマンドを実行すると正常に動作します。ただし、.bashrcファイルを挿入すると、.bashrcファイルは引き続きロードされます。
Script started, output log file is 'typescript'.
Script started, output log file is 'typescript'.
Script started, output log file is 'typescript'.
Script started, output log file is 'typescript'.
ローカル変数を設定してコマンドを2番目にスキップするこのソリューションを試しました。 https://unix.stackexchange.com/a/323920/381656
これにより問題が発生する可能性があります。単純な端末でこのコマンドを実行すると正常に動作します。ただし、.bashrcを入れると、常に現在のディレクトリがホームディレクトリに変わります。たとえば、ターミネータで分割画面を使用すると、そのディレクトリではなくホームディレクトリで開きます。
.bashrcコマンドをアクティブな端末セッションで実行する方法と同様に実行する方法はありますか?
修正する
数回の試行錯誤の末に問題を発見しました。なぜ同じディレクトリで開かないのですか。
/abc/xyzで端末を開くとしましょう。スクリプトが実行されると、新しいシェルが起動します。このシェルの位置を変更しても元の端末には影響しません。元の端末はまだ/abc/xyzの位置を維持します。画面を分割するか新しいタブを開こうとすると、現在のディレクトリのパラメータはスクリプトシェルではなく親シェルから取得されます。
正しい結果を得るには、親シェルの環境変数「PWD」を子シェルに更新する必要があります。しかし、他の質問で述べたように、これは不可能です。
ユーザー空間で子項目から親項目に環境変数を渡すことはできますか?
可能なハッキングの1つは、テキストファイルを使用して現在のディレクトリを保存し、新しいタブが開いたときにその場所に更新することです。
ベストアンサー1
コマンドscript
自体は bash を子プロセスとして開始します。子プロセスが開始されscript
(にリストされているため.bashrc
)、他のプロセスが開始されます。bash
これがまったく同じテキストが表示され続ける理由です。 a)script
一度だけ呼び出されることを確認し、b)並列script
呼び出し(複数のbashプロセスなど)が互いの出力を上書きしないようにする必要があります。最後に以下を入れることができます.bashrc
# Assumes bash-4.2, see https://stackoverflow.com/a/17538964/2923406
[[ -v IN_SCRIPT ]] || { export IN_SCRIPT=1 ; script "$HOME/typescript.$(date --rfc-3339=ns | tr ' ' '_')" ; exit $?; }
script
変数が存在しない場合にのみIN_SCRIPT
呼び出されます。IN_SCRIPT
子プロセスが再起動しないようにエクスポートされますscript
。さらに、すべてのscript
プロセスは出力を「typescript」というファイルに書き込みます。したがって、複数の端末を並列に実行すると、複数のファイルが生成されます。