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这样的命令之外的新进程运行在同一进程中。