bash:允许用户根据另一个程序的输出更改目录的脚本

时间:2013-05-13 10:53:48

标签: bash shell scripting

背景

这个问题是关于在bash脚本或别名中使用cd命令。

此处有一个相关的SO问题:Why doesn't "cd" work in a bash shell script?

问题:

假设您有一个名为“foopath”的bash程序,它在传入参数时将目录路径发送到stdout,例如

  $> /usr/bin/foopath 1998      ## returns /some/long/path/here/1998
  $> /usr/bin/foopath 80817     ## returns /totally/different/path/80817/files

foopath程序只进行查找并根据用户传入的参数返回它可以找到的最接近的匹配路径。

问题:

1)如何在.bash_profile中构造函数和别名,以便用户可以:

  • 1a)键入foo 1998foo 80817(foopath命令缩短目标)
  • 1b)使用cd foo 1998cd foo 80817更改目录(更改目录目标)
  • 1c)从命令提示符更改目录(not-just-subshel​​l-only goal)

陷阱

由于上述1c的目标,这个看似简单的任务证明是繁琐的。换句话说,函数/别名应该可以交互使用,正如Why doesn't "cd" work in a bash shell script?中相关SO帖子中的示例所示。

2 个答案:

答案 0 :(得分:1)

1a)的

foo () {
    cd "$(foopath $1)"
}

1b)的

cd () {
    case $1 in     
      (foo) builtin cd "$(foopath $2)";;
      (*)   builtin cd "$@";;
    esac
}

1c)1a)和1b)都可以交互使用。

答案 1 :(得分:1)

解决方案可能是

  1. 通过使脚本成为函数

    function script() 
    {
         cd "$(foopath "$*")"
    }
    
  2. 改为使用source script.sh(或. script.sh),因此脚本在调用shell中运行