终端上的钩子。我可以在终端中运行命令之前调用方法吗?

时间:2012-05-23 23:32:11

标签: c bash shell command-line terminal

我想制作一个存储有关文件/目录信息的终端应用程序。如果文件被移动或重命名,我想要一种方法来保存信息。

我认为我能做的是在运行任何命令之前执行一个函数。我发现了这个:

http://www.twistedmatrix.com/users/glyph/preexec.bash.txt

但我想知道这是不是一个很好的方法。或者我应该做些什么?

我想在输入mv时从C程序调用该函数。

4 个答案:

答案 0 :(得分:1)

如果你要做的是将某种元数据附加到文件中,那么有更好的支持方式 - extended attributes

另一个解决方案可能是使用文件的inode编号作为您自己维护的数据库的索引。

答案 1 :(得分:0)

你可以为mv命令设置别名吗?在.profile或.bashrc

alias mv=/usr/bin/local/mymv

其中mymv是一个已编译的可执行文件,它运行您的C代码函数并调用/ usr / bin / mv。

precmd和preeexec为每个运行的bash脚本增加了一些开销,即使脚本从不调用mv。别名的缺点是它需要/ usr / local中的新代码,如果脚本或用户使用/ usr / bin / mv而不是mv,它将无法执行您想要的操作。通常做这样的事情通常意味着有一种更好的方法来处理某种服务(守护进程)或驱动程序的问题。另外,如果您的C代码无法正确处理有趣的输入,例如

,会发生什么
mv somefille /dev/null

答案 2 :(得分:0)

如果要在终端中执行某些命令后每次都运行命令,只需将以下内容放在~/.bashrc中:

PROMPT_COMMAND="your_command;$PROMPT_COMMAND"

如果您希望每次执行mv之前执行命令,请将以下内容放在~/.bashrc中:

alias mv="your_script"

如果需要,请确保您的脚本将执行真实的mv

您可以使用inotify库来跟踪文件系统更改。这是一个很好的解决方案,但是一旦用户删除文件,它就已经消失了。

答案 3 :(得分:0)

您可以在Bash中使用DEBUG trap

来自man bash

  

如果sigspec是DEBUG,则命令arg在每个之前执行                 简单命令,命令,case命令,select命令,every                 arithmetic for command,在执行第一个命令之前                 一个shell函数