99

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

这就是我想要做的:

which oracle | cd
cd < which oracle

但它们都不起作用。

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

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

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

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

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

7 回答 7

147

在命令需要来自标准输入的参数的情况下,您可以使用管道。(更多关于这个)。

使用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)")"

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

于 2010-08-09T05:25:09.970 回答
26

用 dirname 获取目录:

cd $(which oracle | xargs dirname)

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

于 2010-08-09T05:38:42.823 回答
10
cd `which oracle`

注意那些是反引号(通常是美国键盘上 1 左边的键)

于 2010-08-09T05:25:42.470 回答
4

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

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

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

于 2010-08-09T11:07:39.777 回答
2

你不需要管道,你可以使用 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
于 2010-08-09T10:56:01.610 回答
1

针对您编辑的问题,您可以使用以下命令删除命令的名称dirname

cd $(dirname `which oracle`)
于 2010-08-09T05:37:56.467 回答
1

除了上面的好答案之外,需要提到的一件事是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

于 2014-08-24T07:39:54.883 回答