bash - 如何将结果从which命令传递到cd

时间:2010-08-09 05:23:08

标签: linux bash shell cd

如何将which命令的结果传递给cd

这就是我想要做的事情:

which oracle | cd
cd < which oracle

但它们都不起作用。

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

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

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

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

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

7 个答案:

答案 0 :(得分:104)

如果命令需要标准输入的参数,则使用管道。 (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)")"

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

答案 1 :(得分:22)

使用dirname获取目录:

cd $(which oracle | xargs dirname)

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

答案 2 :(得分:8)

cd `which oracle`

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

答案 3 :(得分:4)

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

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

避免反引号,它们的可读性较差,并始终引用流程替换。

答案 4 :(得分: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

答案 5 :(得分:1)

为了回答您编辑的问题,您可以使用dirname删除命令的名称:

cd $(dirname `which oracle`)

答案 6 :(得分:0)

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