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


87

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

这就是我想要做的:

which oracle | cd
cd < which oracle

但是它们都不起作用。

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

编辑:再三考虑,此命令将失败,因为目标文件不是文件夹/目录

因此,我正在考虑并找到一种更好的方法来摆脱尾随的“ / oracle”部分(sed或awk,甚至是Perl):)

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

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

2
这会给您命令,而不是目录
Anycorn 2010年

您是否要获取安装程序的目录?dirnamebasename
2010年

@aaa:没错,我认为目录名更好,因为它指向“真实目录”而不是指向oracle可执行文件的符号链接...这就是为什么我的sed方法会失败的原因:)
Michael Mao

Answers:


128

如果命令需要来自标准输入的参数,则可以使用管道。(更多有关此内容)。

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

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


凉。您能否解释一下这里发生的事情?看起来像是变量取消引用;命令的结果是否存在一些默认的临时变量?
Nate W.

啊,我忘记了反引号的竞争:(
Michael Mao,2010年

4
您还需要另外一对引号:cd "$(dirname "$(which oracle)")"
菲利普

|打开一个新进程,因此即使cd从STDIN中读取cmd | cd该文件也不起作用(即原始进程中的当前目录将保持不变)。
Kyle Strand'4

23

使用dirname获取目录:

cd $(which oracle | xargs dirname)

编辑:提防包含空格的路径,请参阅下面的@anishpatel注释


2
cd "$(which oracle | xargs -0 dirname)"如果路径中可能包含空格,请使用。-0标志将输入分隔为空而不是空格。
anishpatel

9
cd `which oracle`

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


1
如果路径中包含空格或其他“特殊”字符,则此方法不起作用,并且您必须删除文件名。
菲利普

@Philipp,如果您的路径具有特殊字符,可以使用此选项cd "`which oracle`"
Ram Patra

4

好的,这里是使用正确引号的解决方案:

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

避免使用反引号,因为反引号的可读性较低,并且总是引用流程替换项。


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

1

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

cd $(dirname `which oracle`)

如果路径包含空格或其他“特殊”字符,则此方法无效。
菲利普

1
通过双引号轻松修复它。
David Z'8

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.