在 shell 中调用时如何自动将命令附加到文件?

在 shell 中调用时如何自动将命令附加到文件?

我想跟踪我正在安装的所有程序,因此每次命令包含pacman -S(-S 之后的重要空格)时,我希望 bash 将命令字符串附加到文件中。目前我正在使用一个函数,但这很烦人,因为我必须转到历史记录并用函数和引号括住该行。我可以 grep 历史记录,但通用解决方案会很方便。

有没有办法在一步 install&log 中自动执行此操作?

答案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

瞧,pacman 正在安装列表中的所有软件包,您将得到相同的结果。

您还可以--needed向 pacman 添加参数,这样它就不会重新安装最新的软件包pacman -S --needed ...

如果您正在远程操作新机器,您可以跳过文件传输,只需将结果通过管道传输到 ssh,它将继续到远程机器:

pacman -Qe | cut -d ' ' -f 1 | tr "\n" " " | ssh -t user@host "sudo pacman -S --needed -"
  • -tssh分配一个伪终端,否则sudo会失败。

祝你好运。

答案2

如果您正在使用bash

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

您还希望它出现在您的.bash_profile或类似的环境中,以便它可以在每个交互式 shell 中运行。

当然,这仅捕获您输入的内容,而不捕获以其他方式执行的任何内容,例如在后台bash运行的前端。pacman

请记住,这确实会影响性能(fgrep为您运行的每个其他命令运行 ),因此虽然这回答了您的问题,但它不一定是满足您跟踪包的目标的最佳方法。

也可以看看:https://superuser.com/q/175799

如果您要使用zsh它,请在手册中查找该preexec功能zsh

答案3

看一下sudosh2用于通过重播记录整个命令历史记录。这可能会做你想做的事。

相关内容