我在这个bash函数中做错了什么?

时间:2010-09-21 17:44:41

标签: bash cd sed function xargs

我正在尝试创建一个转到特定目录的函数,如果指定了一个参数,则将其添加到目录字符串中。但无论我尝试什么,我都无法让它工作,并且bash总是报告X不是目录,即使我将其复制/粘贴到新的命令行也可以从那里工作。

function projects ()
{
  DIR=
  if [ -n "$1" ]
  then
    DIR=$1
  fi
  echo "~/Projects/Working Branches/$DIR" | sed 's/ /\\&/g' | xargs cd
}    

-

$ projects Parametric\ Search\ API
/usr/bin/cd: line 4: cd: ~/Projects/Working Branches/Parametric Search API: No such file or directory
$ projects "Parametric Search API"
/usr/bin/cd: line 4: cd: ~/Projects/Working Branches/Parametric Search API: No such file or directory

我也尝试将sed regexp修改为s/ /\\\\\\&/g,这会生成看似正确转义的字符串,但会产生相同的错误

$ projects Parametric\ Search\ API
/usr/bin/cd: line 4: cd: ~/Projects/Working\ Branches/Parametric\ Search\ API: No such file or directory
$ projects "Parametric Search API"
/usr/bin/cd: line 4: cd: ~/Projects/Working\ Branches/Parametric\ Search\ API: No such file or directory

最后我尝试用我能想到的每一个引号组合围绕$DIR,但到目前为止还没有运气。

4 个答案:

答案 0 :(得分:4)

所以,一个问题是,如果你引用一个带有~的路径,那么在将它传递给cd之前,shell不会扩展它。您可以使用$HOME代替,或将~/放在引号之外来解决此问题。

此外,您无需根据$DIR有条件地设置$1,也不需要使用sedxargs。只需在您的路径中直接使用$1;如果它是空的,那个目录组件将为空,只留下Working Branches目录作为cd的参数。

简单地

function projects () {
  cd "$HOME/Projects/Working Branches/$1"
}

应该工作,稍微短但不太清楚

function projects () {
  cd ~/"Projects/Working Branches/$1"
}

答案 1 :(得分:2)

也许你过度设计了这个:

cd "~/Projects/Working Branches/"
cd "$DIR"

但是,我并没有真正达到sed命令的目的,所以也许我错过了一些东西。

答案 2 :(得分:2)

问题是,波形扩展是由shell(bash)执行的,并且xargs和cd以及OS都不会这样做。这就是包含〜的目录未知的原因。您可以使用$ HOME代替~whil将被双引号之间的工作目录替换,或将代字号放在引号之外(即〜/"...").

此外,使用xargs调用cd不会改变工作目录,因为cd是在一个单独的进程中运行的,考虑只使用cd~ /“Projects / Working Branches /”。

答案 3 :(得分:1)

xargscd在我的bash中无法协同工作。我认为这是因为xargs需要一个应用程序,cd是bash shell中的内置函数。

如果是这种情况,请在您的主目录中尝试echo "Projects" | xargs cd

另一个问题是~没有像你想象的那样得到扩展。请尝试使用完整路径。或者使用反引号展开~

echo ´echo ~/`"Projects/Working Branches/$DIR"