bash – 如何pipe理从哪个命令到cd的结果

我怎么能从一个命令的结果pipe道cd

这是我想要做的:

 which oracle | cd cd < which oracle 

但是他们都没有工作。

有没有办法做到这一点(而不是复制/粘贴当然)?

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

所以我正在思考和制定一个更好的方法来摆脱尾随的“/ oracle”部分(sed或awk,甚至Perl):)

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

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

在命令需要标准input参数的情况下使用pipe道。 ( 更多关于这个 )。

cd命令不是这样的。 该目录是命令参数。 在这种情况下,您可以使用命令replace。 使用反引号或$(...)来评估命令,并将其存储到variables中。

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

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

 cd `which oracle` 

或者如果你的path有特殊的字符

 cd "`which oracle`" 

要么

 cd $(which oracle) 

这相当于反引用符号,但build议(反引号可以与撇号混淆)

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

 cd $(dirname $(which oracle)) 

(这表明你可以很容易地使用嵌套)

$(...) (以及反引号)也适用于双引号string,这有助于结果最终可能包含空格。

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

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

用dirname获取目录:

 cd $(which oracle | xargs dirname) 

编辑:当心含有空格的path,请参阅下面的@anishpatel注释

 cd `which oracle` 

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

好的,这里使用正确的引用的解决scheme:

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

避免反引号,他们不太可读,总是引用过程replace。

你不需要pipe道,你可以用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 

为了响应你编辑的问题,你可以使用dirname去除命令的名字:

 cd $(dirname `which oracle`) 

除了上面的好的答案之外,还有一点需要提的是, cd是一个shell内build的,除了像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