【问题标题】:What am I doing wrong in this bash function?我在这个 bash 函数中做错了什么?
【发布时间】:2011-04-15 08:40:15
【问题描述】:

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

【问题讨论】:

  • 这属于stackoverflow。
  • 您应该在脚本中使用$HOME 而不是~。你从哪里得到/usr/bin/cd?它不可能做任何有用的事情。 (嗯,也有例外。)您不需要转义目录中的空间。引号将占用空间。
  • @Dennis - 以 /usr/bin/cd 开头的行是 bash 的输出,告诉我调用 cd 时出现错误
  • 这就是我的意思。您尝试执行xargs cd,但它不起作用,但您的系统上显然存在一个名为/usr/bin/cd 的文件。 xargs cd/usr/bin/cd 都不起作用。 /usr/bin/cd(不管是什么)正在输出错误消息,这可能是一个 Bash 脚本,我不知道。

标签: bash cd sed function xargs


【解决方案1】:

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

另外,你不需要基于$1有条件地设置$DIR,也不需要使用sedxargs。只需在路径中直接使用$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/" 代替。

    【讨论】:

      【解决方案3】:

      也许你过度设计了这个:

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

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

      【讨论】:

      • 你可以把它合并成一个cd "$HOME/Projects/Working Branches/$DIR"
      • 我正在使用 sed 尝试使用 \ 转义路径中的空格
      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-02
        • 1970-01-01
        • 2020-11-04
        • 2018-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多