実現したいこと
vscode の sshターミナル画面の出力内容を常時テキストファイルに出力して、後から確認できるようにしたいのですが、そのような機能はあるのでしょうか?
- Teratermのログ出力機能と同様の機能を期待します。
そういった拡張機能がありそうですが、見つかりませんね。
ちょっと実現したいこととズレるのでコメントにしますが、terminal.integrated.scrollback をある程度大きくしておけば、ターミナルの内容はずっと残っているので手作業のコピペでファイル保存はできると思います。
VS Code ではなく、接続先で記録をとるので良ければ script を使うのもいいと思います。ssh でつないだ時に自動で記録するようなことをやっておられる方もいます。
https://zenn.dev/book000/articles/linux-logging-by-script
返事が遅れてすみません。ありがとうございます。
この script でやりたいことが実現できるかもしれません。
ためしてみたいと思います。
時間はかかりますが、経過はお知らせいたします!
scriptで出力することができました。
しかし、/etc/profile.d/ に配置した シェルに記載したaliasがすべて無効になってしまいました。
このシェル内の変数は有効ですが、aliasが無効です。
script 起動後に このシェルを source で読み込むと、aliasが使えるようになりました。
惜しいところまでできてるんですけどねぇ。
/etc/profile.d 以下のファイルは /etc/profile で読み込まれるのですが、
============
/etc/profile
============
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
============
/etc/profile はログインシェル、もしくは bash --login を実行する場合にのみ読み込まれて評価されます。
bash(1)
> When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, ...
なので、VSCode のターミナル起動時の bash 実行で --login オプションを追加する必要があります。(具体的な設定方法は私には判りませんが)
--login オプション相当の設定は、以前にやっていました。
シェル内で定義した環境変数はLoadされますがaliasが無視されるという奇妙な現象です。
vscodeだけじゃなくて、Teratermでも起きます。
シェルの書き方がまずいのかもしれません。
というのも、apt upgrade を行うと、このシェルのせいで失敗するんです。
一時的にrenameして、for i in /etc/profile.d/*.sh; do から除外させると
apt upgradeが成功しました。
でも、このシェルがないと仕事できないのでapt が終わったら戻します。
内容はこんな感じで、 kubernetess関連でよく使うコマンドを alias or functionにしています。
alias getstf="${KC_PATH} get statefulset"
function execit() {
${KC_PATH} exec -it "$1" -- /bin/bash
}
apt upgradeを実行すると functionのところで syntax errorになるんです。意味不明です。
ということで、いただいた参考情報のようにprofileに script を追加することで期待の動作はできてます。
script を実行すると、 /etc/profile の実行がその時点で止まってしまうのでいいんだろうかという疑問はあります。
script 自体はよい解法だと思うので、この呼び出しを vscode 側にタイプさせればよいのかなと思ってます。
(できるかどうか不明ですが)
> functionのところで syntax errorになるんです。
> function execit() {
function のパラメータ指定部 "()" は bash の拡張仕様です。おそらく、apt upgrade の内部処理(シェルスクリプトの呼び出し?)では dash が使われているのではないかと思います。その場合は "()" を削除します。(削除しても bash で問題なく動作します)
function execit {
${KC_PATH} exec -it "$1" -- /bin/bash
}
筋違いな疑問にまで答えていただいて申し訳ないです。ありがとうございます。
dash なるものがあるのですね。初めてしりました。
このエラーは解消できたのですが、私の勘違いで原因はここではありませんでした。
うまく動作しない原因は script 側にあるようです。
/etc/profile にて script を起動したあとのterminalは、alias や finctionを忘れています。
exit で終了すると元のterminalに戻ります。
ここでは、自前のalias や function が使えます。
/etc/profile に script を設定するのではなく、ログオン後に script を実行した場合は 自前のshellをsource でloadしてalias や functionが使えました。
script の引数に -c でコマンド実行ができます。
ここで事前実行できないかと思ったのですが、シェルを指定すると即時終了してしまいました。
とても惜しいところまで来てる気がします。
自分でタイプしてscriptを起動するような記述方法があるのでしょうか?