我正在尝试创建一个转到特定目录的函数,如果指定了一个参数,则将其添加到目录字符串中。但无论我尝试什么,我都无法让它工作,并且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
,但到目前为止还没有运气。
答案 0 :(得分:4)
所以,一个问题是,如果你引用一个带有~
的路径,那么在将它传递给cd
之前,shell不会扩展它。您可以使用$HOME
代替,或将~/
放在引号之外来解决此问题。
此外,您无需根据$DIR
有条件地设置$1
,也不需要使用sed
和xargs
。只需在您的路径中直接使用$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)
xargs
和cd
在我的bash中无法协同工作。我认为这是因为xargs
需要一个应用程序,cd
是bash shell中的内置函数。
echo "Projects" | xargs cd
。
另一个问题是~
没有像你想象的那样得到扩展。请尝试使用完整路径。或者使用反引号展开~
echo ´echo ~/`"Projects/Working Branches/$DIR"