0

我正在尝试创建一个转到特定目录的函数,如果指定了单个参数,则将其添加到目录字符串中。但是无论我尝试什么,我都无法让它工作,并且 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 正则表达式,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

4 回答 4

4

所以,一个问题是,如果你在其中引用一个路径~,shell 在将它传递到cd. 您可以通过使用$HOME来解决此问题,或者通过将~/引号放在外面。

此外,您不需要$DIR基于有条件地设置$1,也不需要使用sedand xargs$1直接在你的路径中使用;如果它为空,则该目录组件将为空,只留下Working Branches目录作为cd.

简单地

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

应该可以工作,稍微短一点但不太清楚

function projects () {
  cd ~/"Projects/Working Branches/$1"
}
于 2010-09-21T19:21:36.777 回答
2

也许你过度设计了这个:

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

不过,我并没有真正理解该sed命令的目的,所以也许我遗漏了一些东西。

于 2010-09-21T18:25:51.133 回答
2

问题是波浪号扩展是由 shell (bash) 执行的,xargs、cd 和操作系统都不会这样做。这就是为什么包含 ~ 的目录是未知的。您可以改用 $HOME 代替 ~,而将替换为双引号之间的工作目录,或者将波浪号放在引号之外(即 ~/"...")。

此外,使用 xargs 调用 cd 不会更改工作目录,因为 cd 在单独的进程中运行,请考虑仅使用 cd ~/"Projects/Working Branches/" 代替。

于 2010-09-21T19:09:01.243 回答
1

xargs并且cd不能在我的 bash 中一起工作。我认为这是因为xargs想要一个应用程序并且cd是 bash shell 中的一个内置函数。

尝试echo "Projects" | xargs cd在您的主目录中检查是否是这种情况。

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

echo ´echo ~/`"Projects/Working Branches/$DIR"
于 2010-09-21T18:14:17.550 回答