2011-03-20 66 views
3

我试着写一击未发现句柄执行以下操作当前工作目录:如何更改内部command_not_found_handle

  1. 如果$ 1成立,这是一个目录,cd进去。
  2. 如果$ 1存在于用户定义的目录$DEV_DIR中,请将其放入CD中。
  3. 如果以前的条件不适用,则失败。

现在,我有这样的事情:

export DEV_DIR=/Users/federico/programacion/ 

function command_not_found_handle() { 
    if [ -d $1 ]; then   # the dir exists in '.' 
     cd $1 
    else 
     to=$DEV_DIR$1 
     if [ -d $to ]; then 
      cd $to 
      echo `pwd` 
     else 
      echo "${1}: command not found" 
     fi 
    fi 
} 

虽然它似乎是工作(在echo pwd命令打印预期的目录),在实际壳的目录并没有改变。

我的印象是,由于这是我的.bashrc内的函数,shell不会分叉,我可以执行cd,但显然这不起作用。任何提示如何解决这个将不胜感激。

+0

为什么你需要这样做?最有可能有更好的方法来完成你想要的任何事情。 – 2011-03-20 21:31:48

+2

我想在一个简单的方法让所有项目保存的目录下的子目录之间移动。在做'cd〜/ prog; cd某事'一段时间后有点累。我很想听听任何其他建议。 – 2011-03-21 21:21:06

回答

2

认为发生了什么事情是,外壳fork()■在设置任何重定向后,但在寻找命令之前,所以command_not_found_handle可以在不影响交互shell进程。

+1

+1比较:'f(){echo“$$ $ BASHPID”; }; F; command_not_found_handle(){echo“$$ $ BASHPID”; }; foob​​le“(假设你没有任何叫做”fooble“的东西)。一个新的外壳是分叉的。(另外,请注意,如果您在函数中包含那些用于其他比较的函数,那么'$ SHLVL'和'$ BASH_SUBSHELL'不会改变。) – 2011-03-20 21:29:26

0

如果您将此程序作为主外壳中的脚本运行,它将不会改变,因为它在执行时会创建子外壳。如果您在当前shell中输入脚本,那么它将会产生所需的效果。

~/wbailey> source command_not_found.sh 

这么说,我觉得有以下将获得相同的结果:

[email protected]:~/code_katas> cd xxx 2> /dev/null || cd ..; pwd 
/Users/wesbailey 

只需更换“..”与你的环境变量定义的目录,并建立在你的.bashrc文件的别名。

+0

这不是它不工作的原因。该函数是在当前shell中定义的,但Bash派生一个新的shell来执行该函数(通常情况下不是这样)。 – 2011-03-20 21:30:42

+0

定义别名的想法正是我不想做的。我的'$ DEV_DIR'里有82个目录,所以我不想为每个目录创建一个新的别名。 – 2011-03-21 21:17:10

+0

@FedericoBuiles,他正在讨论用别名替代cd,该别名也试图cd到您的项目目录,而不是每个项目的单独别名。你可能想用一个shell函数替换cd,而不是别名,所以你可以[-d“$ mydir/$ 1”]在尝试内置cd之前。而且,pwd不会将目录作为参数,所以IDK正是Wes所要做的。 – 2013-11-26 02:28:14

1

你似乎有什么想使用autocd功能做可以部分可能:

shopt -s autocd 

man bash

autocd - 如果设置,一个命令名称是一个目录的名称执行 就好像它是cd com- mand的参数一样。该选项仅供交互式shell使用。

否则,只需创建一个函数,您可以通过执行您正在尝试使用的操作的名称调用command_not_found_handle

+0

这适用于'.'中的目录,但我想要完成的最重要的事情是能够快速移动到其他位置的目录。不过,我会记住的,谢谢。 – 2011-03-21 21:16:04

+1

@FedericoBuiles:我在最后一句中提出的建议如何? – 2011-03-21 23:45:11

+0

这就需要我每次输入函数的名字(这与设置'autocd'实际上是一样的)。尽管如此,我很欣赏你的努力。 – 2011-03-24 17:17:12