shell 终端上的钩子,我可以在终端运行命令之前调用一个方法吗?

roejwanj  于 2022-11-16  发布在  Shell
关注(0)|答案(5)|浏览(180)

我想做一个终端应用程序,存储有关文件/目录的信息。我想要一种方法,以保持信息,如果文件被移动或重命名。
我想我可以做的是在任何命令运行之前执行一个函数。我发现了这个:
http://www.twistedmatrix.com/users/glyph/preexec.bash.txt
但我在想这是不是个好办法,或者我应该做点别的?
我想无论何时输入mv,我都会从C程序中调用该函数。

s5a0g9ez

s5a0g9ez1#

如果您要尝试将某种元数据附加到文件中,则有一种更好的支持方式-extended attributes
另一种解决方案可能是使用文件的inode编号作为您自己维护的数据库的索引。

0x6upsns

0x6upsns2#

您可以在.profile或.bashrc中使用mv命令的别名吗?

alias mv=/usr/bin/local/mymv

其中,mymv是一个编译后的可执行文件,它运行C代码函数并调用/usr/bin/mv。
precmd和preeexec会给运行的每个bash脚本增加一些开销,即使脚本从不调用mv。alias的缺点是它需要/usr/local中的新代码,并且如果脚本或用户使用/usr/bin/mv而不是mv,它将不会执行您想要的操作。通常,这样做通常意味着有更好的方法来处理某种服务的问题另外,如果您的C代码不能正确处理感兴趣的输入(如

mv somefille /dev/null
alen0pnh

alen0pnh3#

如果你想每次在终端中执行某个命令后运行命令,只需在~/.bashrc中输入以下内容:

PROMPT_COMMAND="your_command;$PROMPT_COMMAND"

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

alias mv="your_script"

如果需要,请确保脚本将执行真实的的mv
你可以使用inotify库来跟踪文件系统的变化。这是一个很好的解决方案,但是一旦用户删除文件,它就已经消失了。

7lrncoxx

7lrncoxx4#

你也许可以在Bash中使用DEBUGtrap
man bash开始:
如果sigspec为DEBUG,则在每个简单命令、for命令、case命令、select命令、每个算术for命令之前,以及在shell函数中执行第一个命令之前,执行命令arg

6ju8rftf

6ju8rftf5#

当我被迫在tcsh中工作时,我发现了这篇文章,我想确保当用户从某个文件夹运行程序时,特定的environemtn变量存在(没有全局设置该变量)
tcsh可以做到这一点。
tcsh有special alias,其中一个是precmd。这可用于在打印shell提示符之前运行脚本。例如,我使用了set precmd 'bash $HOME/.local/bin/on_cd.sh'
这可能是csh中为数不多的有用特性之一。这是一个遗憾,但我不认为相同或类似的特性是在bash或其他sh衍生物(ash,破折号等)。Related answer.

相关问题