linux里有关管道符的疑惑

对于linux的管道符 “|” 我一直有一个疑惑,当我想要使用类似如下命令时总是不能达到我想要的结果:

假设有一个文件:path.txt

里面记录了一个地址:

$ cat path.txt
~/Download/

而我想要把这个地址通过“|”导入到cd或者ls命令中,比如这样:

$ cat path.txt | ls

却总是不能如愿,它并没有列出~/Download里的内容。

我经过一番查询,发现了一些东西。

我们平时给ls后面接上的那串东西是参数,而管道符传递给ls的只有标准输入,ls是不会从标准输入里找参数的。

grep能接收标准输入,因此能正确运行类似 ls | grep log.tx t的命令,

那么grep与ls区别是什么呢?

这需要分清两样东西:1.参数 2.输入

命令的运行需要我们指定些参数给它,好让它知道它应该怎么运行才能让我们满意。

ls -al
ps -ef
rm -rf

-al -ef -rf都是命令的参数,用来告诉命令它们应该怎么完成任务。

对于 ls | grep log.txt 来说,log.txt就是grep 的参数,参数不能由管道符“|”给出的标准输入提供。

grep 从管道符"|"中获得的东西去了哪呢?

答案是管道符的标准输入进入了缓冲区,等待grep里类似scanf()函数读取。

我们可以做个实验,我们在终端输入

$ grep 123

我们会发现程序运行中断了,似乎是在等待我们输入什么,于是输入12345,

结果程序输出了12345,

我们再输入67890,

程序没有输出,看来道理已经很明显了,管道符的标准输入跑到这里来,被grep的类似scanf()的函数读取了。

妈妈再也不用担心我的cat path.txt | ls 为什么运行不了了

因为ls需要的是参数,而不是会跑到缓冲区里的标准输入!!!

时间: 2024-10-07 17:43:18

linux里有关管道符的疑惑的相关文章

curses不是linux里默认的C函数库

今天在调试一个贪吃蛇程序时,出现如下错误: [[email protected] c++]$ g++ snack.cpp -o snack/tmp/ccCuZ3Jm.o:在函数‘playgame(int, int)’中:snack.cpp:(.text+0xce):对‘erase’未定义的引用snack.cpp:(.text+0xed):对‘mvprintw’未定义的引用snack.cpp:(.text+0x140):对‘mvprintw’未定义的引用snack.cpp:(.text+0x166

linux里source、sh、bash、./有什么区别(转)

add by zhj: 主要不同是,source是在当前shell中执行脚本,而sh, bash, ./是在当前shell的child shell中执行脚本 原文:http://www.cnblogs.com/pcat/p/5467188.html 在linux里,source.sh.bash../都可以执行shell script文件,那它们有什么不同吗? ----------- 1.source source a.sh 在当前shell内去读取.执行a.sh,而a.sh不需要有"执行权限&q

linux 里 /etc/passwd 、/etc/shadow和/etc/group 文件内容解释

•/etc/passwd文件用于存放用户账户信息,每行代表一个账户,每个账户的各项信息用冒号分割,例如: root:x:0:0:root:/root:/bin/bash username:password:uid:gid:allname:homedir:shell 1.用户名. 2.密码,“x”代表密码存储在/etc/shadow中:当该值为其他任意非“x”值时,可以通过root用户切换(不需要密码),但是都无法通过非root用户切换到相应用户,因为无法获得起密码了. 3.uid,用户id,0-

linux里终端安转视频播放器的操作及显示

[[email protected] ~]$ mplayerbash: mplayer: command not found[[email protected] ~]$ yum list | grep mplayer^C^C Exiting on Broken Pipe [[email protected] ~]$ [[email protected] ~]$ SUbash: SU: command not found[[email protected] ~]$ su密码:su: 密码不正确[[

Linux里startup.sh 和 shutdown.sh

最近用socket编写了一个服务端程序,监听1024端口,检测客户端发来的请求,所在Linux里写启动和停止的脚本: 在Eclipse里java写好程序,右击导出生成 Runnable JAR file 然后socketServer.jar上传到服务器即可. 1.启动 startup.sh # ---------------------------------------------------- # Start script for the Socekt Server # ----------

Linux里如何设置IP(RED HAT)

一共包括以下两步 1:通过setup命令设置IP 保存…… --返回前面,配DNS 保存退出…… 2:重启网络服务 Linux里如何设置IP(RED HAT)

linux里引号注意点

python 中会把所有不带引号的(双引号或单引号)字符串都视作变量,会去尝试解释它,如果没有值则报错所以,想要引入一个字符串就必须加引起号 shell中关于引号 shell中系统会把单绰号中的字符都视作字符本身,没有任务他意.而在双引号里部分特殊字符照常会被解释,如("$",反引号"`")等 grep,sed,awk中关于引号它们中单引号里的字符都不是会被系统shell所解释,但会被grep,sed,awk内部解释器解释.例如:grep -E '^a|b' fil

linux里忘记root密码解决办法

1:打开虚拟机,点‘启动’按钮, 2:出现上面这个界面时,键盘输入’i’,出现grub界面: 3:键盘输入e,出现如下界面: 4:选择第二行(kernel……) 5:键盘输入e,出现如下界面: 6:在rhgb quiet后加上空格和数字1或者空格和single后回车. 这里以加空格和数字1为例: 然后,系统自动回到了上一层编辑界面,然后直接按b键,以简单模式重启. 重启过程在此省略. 重启完毕后,就到了下面的界面了,就可以开始修改密码了. 直接输入passwd 回车即可修改密码,在默认情况下这里

[转]在Linux里设置环境变量的方法

在Linux里设置环境变量的方法(export PATH) 一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量.例如我的mips-linux-gcc编译器在“/opt/au1200_rm/build_tools/bin”目录下,build_tools就是我的编译工具,则有如下三种方法来设置环境变量: 1.直接用export命令:#export PATH=$PATH:/opt/au1200_rm/build_tools/bin查看是否已经设好,可用命令export查看