bash处理之前的预处理行

时间:2014-06-09 22:21:31

标签: bash

有没有办法在bash处理之前预先处理以交互模式进入bash的行?

我想介绍一些自定义速记语法来处理长路径。例如,我不想写'cd / one / two / three / four / five',而是希望能够编写类似'cd /.../five'的内容,然后我的预处理脚本将替换为前一个命令(如果一个唯一的目录'五'存在于/)下面。

我发现http://glyf.livejournal.com/63106.html描述了在执行命令之前如何执行钩子函数。但是,该方法不允许更改要执行的命令。

3 个答案:

答案 0 :(得分:0)

对于所有命令,通常没有好办法。

但是,您可以通过使用函数覆盖特定命令来执行此操作。对于cd案例,您可以在.bashrc

中添加类似内容
cd() {
  path="$1"
  [[ $path == "/.../five" ]] && path="/one/two/three/four/five"
  builtin cd "$path"
}

答案 1 :(得分:0)

bash 4或更高版本中,您可以使用globstar选项。

shopt -s globstar
cd /**/five

假设five是唯一目录。

答案 2 :(得分:0)

简短的回答是不直接。如您所见,PROMPT_COMMAND环境变量允许您在显示提示之前发出命令,这可以允许一些非常有创意的用途,例如: Unlimited BASH History,但没有任何东西可以让你直接解析和替换输入。

您想要做什么可以使用.bashrc中的功能和别名来完成。一种方法是使用findutils-locate或简单的find命令来搜索当前工作目录下的目录,以获取省略路径中的最后一个组件,然后提供完整路径作为回报。但是,即使使用索引,locate也会花费一些时间,并且根据深度,find本身可能会因为对所有可能的目录执行此操作而变慢。但是,如果您有一个特定目录的列表,您希望实现类似的目的,那么该解决方案将是可行且相对容易的。

要提供任何类型的原型或更详细的信息,我们需要了解更多关于如何使用路径信息以及是否可以在单个命令中提供多个路径的信息。

如果目录five不是唯一的......

,则会出现另一个问题