【问题标题】:bash - how to pipe result from the which command to cdbash - 如何将结果从 which 命令传送到 cd
【发布时间】:2011-03-27 03:15:29
【问题描述】:

如何将which 命令的结果通过管道传输到cd

这就是我想要做的:

which oracle | cd
cd < which oracle

但它们都不起作用。

有没有办法实现这一点(当然不是复制/粘贴)?

编辑:再想一想,这个命令会失败,因为目标文件不是文件夹/目录

所以我现在正在考虑并想出一个更好的方法来摆脱尾随的“/oracle”部分(sed 或 awk,甚至是 Perl):)

编辑: 好的,这就是我最后得到的:

cd `which oracle | sed 's/\/oracle//g'`

【问题讨论】:

  • 给你命令,而不是目录
  • 您是否要获取安装程序的目录? dirname, basename ?
  • @aaa :你是对的,我认为 dirname 更好,因为它指向“真正的目录”而不是指向 oracle 可执行文件的符号链接......这就是为什么我的 sed apporach 会失败:)

标签: linux bash shell cd


【解决方案1】:

在命令需要来自标准输入的参数的情况下,您可以使用管道。 (More on this)。

使用cd 命令并非如此。目录是命令参数。在这种情况下,您可以使用命令替换。使用反引号或$(...) 评估命令,将其存储到变量中..

path=`which oracle`
echo $path # just for debug
cd $path

虽然它可以以更简单的方式完成:

cd `which oracle` 

或者如果你的路径有特殊字符

cd "`which oracle`"

cd $(which oracle)

相当于反引号,但建议使用(反引号可能与撇号混淆)

.. 但它看起来像你想要的:

cd $(dirname $(which oracle))

(这表明您可以轻松使用嵌套)

$(...)(以及反引号)也可以在双引号字符串中使用,这在结果可能最终包含空格时会有所帮助..

cd "$(dirname "$(which oracle)")"

(请注意,两个输出都需要一组双引号。)

【讨论】:

  • 酷。你能解释一下这里发生了什么吗?这看起来像一个变量取消引用;是否有一些默认的临时变量存放命令的结果?
  • 啊,我忘记了关于反引号的竞争 :(
  • 你需要另外一对引号:cd "$(dirname "$(which oracle)")".
  • | 打开了一个新进程,所以即使cd 从 STDIN 读取,cmd | cd 也不起作用(即原始进程中的当前目录将保持不变)。
【解决方案2】:
cd `which oracle`

注意这些是反引号(通常是美式键盘上 1 左侧的键)

【讨论】:

  • 如果路径包含空格或其他“特殊”字符,这将不起作用,并且您必须去掉文件名。
  • @Philipp 如果你的路径有特殊字符cd "`which oracle`",你可以使用它
【解决方案3】:

针对您编辑的问题,您可以使用dirname 去掉命令的名称:

cd $(dirname `which oracle`)

【讨论】:

  • 如果路径包含空格或其他“特殊”字符,这将不起作用。
  • 通过双引号轻松修复。
【解决方案4】:

用dirname获取目录:

cd $(which oracle | xargs dirname)

编辑:小心包含空格的路径,请参阅下面的@anishpatel 评论

【讨论】:

  • 如果路径可能包含空格,请使用cd "$(which oracle | xargs -0 dirname)"。 -0 标志按 null 而不是空格分割输入。
【解决方案5】:

你不需要管道,你可以使用 Bash 参数扩展做你想做的事!

进一步提示:如果您使用 Bash,请使用“type -P”而不是外部“which”命令。

# test
touch /ls
chmod +x /ls
cmd='ls'
PATH=/:$PATH
if cmdpath="$(type -P "$cmd")" && cmdpath="${cmdpath%/*}" ; then
   cd "${cmdpath:-/}" || { echo "Could not cd to: ${cmdpath:-/}"; exit 1; }
else
   echo "No such program in PATH search directories: ${cmd}"
   exit 1
fi

【讨论】:

    【解决方案6】:

    好的,这里有一个使用正确引用的解决方案:

    cd "$(dirname "$(which oracle)")"
    

    避免使用反引号,它们的可读性较差,并且总是引用进程替换。

    【讨论】:

      【解决方案7】:

      除了上面的好答案,还有一点需要提到的是 cd 是一个内置的 shell,它运行在同一个进程中,而不是像 ls 这样的新进程,这是一个命令。

      1. https://unix.stackexchange.com/questions/50022/why-cant-i-redirect-a-path-name-output-from-one-command-to-cd

      2. http://en.wikipedia.org/wiki/Shell_builtin

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-15
        • 2014-08-02
        • 1970-01-01
        • 2012-06-09
        • 1970-01-01
        • 2015-01-30
        • 2011-06-28
        相关资源
        最近更新 更多