为什么 xargs cd 在传递带有波浪号的名称时会抛出错误?

问题描述 投票:0回答:4

我正在尝试创建一个转到特定目录的函数,如果指定了单个参数,则将其添加到目录字符串中。但无论我如何尝试,我都无法让它工作,并且 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
,但到目前为止还没有运气。

bash cd sed function xargs
4个回答
4
投票

因此,一个问题是,如果您引用其中包含

~
的路径,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"
}

2
投票

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

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


2
投票

也许你对此过度设计了:

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

不过,我并没有真正理解

sed
命令的目的,所以也许我遗漏了一些东西。


1
投票

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

在您的主目录中尝试

echo "Projects" | xargs cd
来查看是否是这种情况。

另一个问题是

~
不会像你想象的那样通过 echo 得到扩展。尝试改用完整路径。或者使用反引号展开
~

echo ´echo ~/`"Projects/Working Branches/$DIR"
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.