程序员

Linux之cd命令在管道符中不起作用

2018-08-13  本文已影响0人  蛋炒饭爱吃我
  1. 奇怪的一件事儿
    大家是否会有这样的感觉,那就是每天都在你身边的人,并且你自以为很了解他,但是突然有一天他做了一件让你意想不到的事,你开始对他“刮目相看”,你发现你并不是很了解他,他让你感到非常的陌生,这种感觉自然会让你很不爽,你会觉得非常的奇怪,哎~~~,那么为了满足自己的猎奇心理,你就开始探寻问题的答案,这件奇怪的事儿就是cd命令,这个每天差不多敲100遍的命令今天竟然失效了!!!,竟然切换不到指定的目录了,那么这是怎么一回事儿哪?

  2. 问题来了
    大家都知道find命令可以定位文件或目录的路径、cd命令可以切换当前的工作目录例:

etl@bejedw09:/home/etl/cya_2/as/one> find . -name dir_1
./dir_1
etl@bejedw09:/home/etl/cya_2/as/one> cd dir_1
etl@bejedw09:/home/etl/cya_2/as/one/dir_1

于是乎我写出了这样一段命令,以为这样可以一步切换到dir_1目录中

etl@bejedw09:/home/etl/cya_2/as/one> find . -name dir_1 | xargs cd
etl@bejedw09:/home/etl/cya_2/as/one

结果cd命令并没有改变当前的工作目录,我搜了好久类似这样的词条为什么cd命令在重定向语句中不起作用?cd命令不支持重定向等等,结果根本查不到我要的答案,似乎陷入了一个死胡同里,那么我当时是怎么解决这个问题的哪?

  1. 分化、瓦解
    看来直接搜问题的答案这条路走不通了,只能将问题分化开来,我首先关注的点是管道符,我一直觉得是管道符的问题,于是我查了管道符的使用
    (1) 管道命令只能处理前一个命令的标准输出,而不能处理标准错误;
    (2) 管道命令右边必须能够接收标准输入;

    咦~~~管道命令右边必须能够接收标准输入? 难道cd不能接收标准输入吗?继续查cd命令可以接收管道传来的数据吗发现了cd命令确实有些奇特,首先cd命令是通过终端的命令行读取数据的,那么怎么向cd这样的命令传值哪?可以使用反单引号`命令`或 $(命令) 这样的方式

etl@bejedw09:/home/etl/cya_2/as/one> cd `find . -name dir_1`
etl@bejedw09:/home/etl/cya_2/as/one/dir_1
etl@bejedw09:/home/etl/cya_2/as/one> cd $(find . -name dir_1)
etl@bejedw09:/home/etl/cya_2/as/one/dir_1

我在这里再解释一下这个命令find . -name dir_1 | xargs cd ,首先管道符|find命令的返回值作为标准输出传递给cd,而对于cd命令而言,find命令的返回值就是标准输入,而cd是通过终端的命令行读取数据的,不接受标准输入,所以cd命令失效!

上一篇 下一篇

猜你喜欢

热点阅读