我为bash编写了一个内置的修改'cd'命令,这是我的软件的要求。有没有办法实际分发可加载的独立于bash本身?理想情况下,我只想分发“附加功能”,因为我知道人们可以通过修补和编译源代码中的shell来推迟。
我想计算用户在目录中的时间,以便我可以确定他们想要的位置。这是一个功能:http://github.com/joelthelion/autojump/tree/master重写为bash内置,用于性能问题。这个实现使用$PROMPT_COMMAND
工作,但我想要集成一些东西。
答案 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 "$@"
}
只要您的自定义不会影响标准命令的行为,因此不会冒使用它破坏脚本的风险,您的方法就没有错。