シェルから呼び出されたときにファイルにコマンドを自動的に追加する方法は?

シェルから呼び出されたときにファイルにコマンドを自動的に追加する方法は?

私は私がインストールしているすべてのプログラムを追跡したいので、コマンドにpacman -S(-Sの後の重要なスペース)が含まれるたびにbashがコマンド文字列をファイルに追加したいと思います。私は現在関数を使用していますが、履歴に行き、関数と引用符で行を囲む必要があるので面倒です。履歴を確認できますが、一般的な解決策が役に立ちます。

1段階のインストールとログでこれを自動化する方法はありますか?

答え1

私はあなたが達成しようとすることは不可能ではないが、非常に難しいと思います。必要なものを実行するラッパー関数を作成し、実際のコマンドの代わりにラッパーを呼び出すエイリアスを作成しても、すべてエラーが発生します。通常sudo pacman -S、コンテキストを切り替えてすべての機能とエイリアスを破壊するsudoを実行します。

しかし、すべてが失われるわけではありません。明示的なインストールを使用してインストールされているすべてのパッケージを一覧表示できるので、pacman -Qeいつでもシステムを再インストールしたり、環境を別のシステムにコピーしたい場合は、リストをファイルにインポートしてファイルを次のように変更できます。ターゲットコンピュータでpacmanを実行して、すべてのパッケージをインストールします。

文書作成:

pacman -Qe | cut -d ' ' -f 1 | tr "\n" " " >the-file.txt
  • pacman -Qe処置: 明示的にインストールされたパッケージをすべて一覧表示します。
  • cut -d ' ' -f 1:パッケージのバージョンを削除して名前だけを保持することです。
  • tr "\n" " ":改行文字を空白に変更することです。
  • >the-file.txt処置: 出力をファイルにリダイレクトし、必要に応じてファイル名とパスを変更できます。

スペースで区切られたリストがthe-file.txtに出力されたら、ファイルをターゲットシステムに転送して次のように実行します。

sudo pacman -Sy - <the-file.txt

見て、パックマンはリストにあるすべてのパッケージをインストールしており、同じ結果が得られます。

--needed最新のパッケージを再インストールしないように、pacmanにパラメータを追加することもできますpacman -S --needed ...

新しいシステムがリモートで動作している場合は、ファイル転送をスキップして結果をsshにパイプすると、リモートシステムに進みます。

pacman -Qe | cut -d ' ' -f 1 | tr "\n" " " | ssh -t user@host "sudo pacman -S --needed -"
  • SSHを使用して疑似端末を割り当てます-t。それ以外の場合、sudoは失敗します。

頑張ってください。

答え2

以下を使用する場合bash

trap `echo $BASH_COMMAND | fgrep "pacman - S" >> /home/logfile

.bash_profileまた、すべてのインタラクティブシェルで実行できるように、あなたまたは同様の環境に存在したいと思います。

もちろん、これは入力した内容だけをキャプチャし、バックグラウンドbashで実行されているフロントエンドなど、他の方法で実行されるコンテンツはキャプチャしません。pacman

これは、実行している他のすべてのコマンドに対してパフォーマンスに影響を与えるため、fgrep質問に対する回答ですが、必ずしもパッケージ追跡目標を達成する最善の方法ではありません。

また見なさい:https://superuser.com/q/175799

使用したい場合は、zshマニュアルでそのpreexec機能を見つけてくださいzsh

答え3

見るsudosh2再生を通じて全体のコマンド履歴を記録するために使用されます。これはあなたが望むことをすることができます。

関連情報