如何将which
命令的结果传递给cd
?
这就是我想要做的事情:
which oracle | cd
cd < which oracle
但它们都不起作用。
有没有办法实现这一点(当然不是复制/粘贴)?
编辑:第二个想法,这个命令会失败,因为目标文件不是文件夹/目录。
所以我正在思考并找出一个更好的方法来摆脱尾随的“/ oracle”部分(sed或awk,甚至是Perl):)
编辑: 好的,这就是我最终得到的:
cd `which oracle | sed 's/\/oracle//g'`
答案 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 这样的新进程之外,它运行在同一个进程中命令。