我正在尝试创建一个转到特定目录的函数,如果指定了单个参数,则将其添加到目录字符串中。但无论我如何尝试,我都无法让它工作,并且 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
,但到目前为止还没有运气。
因此,一个问题是,如果您引用其中包含
~
的路径,shell 在将其传递到 cd
之前不会扩展该路径。您可以通过使用 $HOME
来解决此问题,或者将 ~/
放在引号之外。
此外,您不需要根据
$DIR
有条件地设置 $1
,也不需要使用 sed
和 xargs
。只需在路径中直接使用 $1
即可;如果它为空,则该目录组件将为空,只留下 Working Branches
目录作为 cd
的参数。
简单
function projects () {
cd "$HOME/Projects/Working Branches/$1"
}
应该可以,稍微短但不太清晰的也可以
function projects () {
cd ~/"Projects/Working Branches/$1"
}
问题是波浪号扩展是由 shell (bash) 执行的,xargs、cd 和操作系统都不会执行此操作。 这就是为什么包含 ~ 的目录是未知的。 您可以使用 $HOME 代替 ~,同时将被双引号之间的工作目录替换,或者将波形符放在引号之外(即 ~/"...")。
此外,使用 xargs 调用 cd 不会更改工作目录,因为 cd 在单独的进程中运行,请考虑仅使用 cd ~/"Projects/Working Branches/" 代替。
也许你对此过度设计了:
cd "~/Projects/Working Branches/"
cd "$DIR"
不过,我并没有真正理解
sed
命令的目的,所以也许我遗漏了一些东西。
xargs
和 cd
在我的 bash 中不能一起工作。我认为这是因为 xargs
想要一个应用程序,并且 cd
是 bash shell 中的内置函数。
在您的主目录中尝试
echo "Projects" | xargs cd
来查看是否是这种情况。
另一个问题是
~
不会像你想象的那样通过 echo 得到扩展。尝试改用完整路径。或者使用反引号展开 ~
echo ´echo ~/`"Projects/Working Branches/$DIR"