我想跟踪我正在安装的所有程序,因此每次命令包含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 -"
- 用
-t
ssh分配一个伪终端,否则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用于通过重播记录整个命令历史记录。这可能会做你想做的事。