分发可加载的内置bash模块

时间:2009-03-14 14:47:51

标签: c bash cd distribute built-in

我为bash编写了一个内置的修改'cd'命令,这是我的软件的要求。有没有办法实际分发可加载的独立于bash本身?理想情况下,我只想分发“附加功能”,因为我知道人们可以通过修补和编译源代码中的shell来推迟。

我想计算用户在目录中的时间,以便我可以确定他们想要的位置。这是一个功能:http://github.com/joelthelion/autojump/tree/master重写为bash内置,用于性能问题。这个实现使用$PROMPT_COMMAND工作,但我想要集成一些东西。

2 个答案:

答案 0 :(得分:2)

更改内置CD是任何管理员的支持噩梦,不受外国用户欢迎。命名为'smart-cd'并让USER通过将其包含在.bashrc或.profile中来决定是否需要该功能有什么问题?然后他们可以设置他们想要的东西。

此外,使用您在目录中的时间长度是一个非常糟糕的偏好指示。您如何区分空转(一夜之间挂在/ tmp中的被遗忘的shell),长时间运行的脚本(夜间cron作业)和实际活动。

还有许多其他方法可用于创建喜爱目录的快捷方式:别名,软链接,$ VARIABLES,脚本。假设您的使用模式将受到系统其他用户的欢迎,这是傲慢的。

答案 1 :(得分:2)

目前还不清楚您修改了哪些内容,但无论如何bash(至少ksh93 IIRC引入了这个概念并zsh)支持,使用enable -f file name语法,将内置函数作为外部动态加载模块加载。

这些纯文件模块当然可以独立分发,只要您确保它们与目标版本/体系结构兼容即可。 5年前,当你提出这个问题时,情况已经如此。

在您的情况下,一个问题是,似乎没有记录的方法来重载动态加载的内部内置函数cd,同时保持访问前者的能力。

一个简单的解决方法是使用不同的名称实现您的自定义CD,例如mycd,如下所示:

int mycd_builtin(list)
WORD_LIST *list;
{
  int rv;
  rv=cd_builtin(list);
  if(rv == EXECUTION_SUCCESS) {
    char wd[PATH_MAX+1];
    getcwd(wd,sizeof(wd));
    // do your custom stuff knowing the new working directory
    ...
  }
  return (rv);
}

然后使用别名或更好的shell函数来定制您的自定义版本而不是常规版本:

cd() {
  mycd "$@"
}

只要您的自定义不会影响标准命令的行为,因此不会冒使用它破坏脚本的风险,您的方法就没有错。