标准输入和参数的区别-刚入门建议别看,我怕你学会了再也不想用Windows
在这里,不解释什么是标准输入和参数(不知道的自己百度,学过C语言等语言的可以对比Scanf等输入函数和函数中的传递的参数概念),我们只解决实际问题。
将其对应到管道符 ‘|’、文件重定向符号 ’ > ’ , ’ < '的应用以及$()的应用。
首先,我们引入一个场景:当我们要查找系统中一个文件,并且要将其删除,而且作为一名程序员,我肯定想在别人面前耍波帅,尽量少操作键盘。那该怎么办?
对于稍微熟悉Linux的程序员来说,他可能就想到了管道符,他的操作思路是通过管道符将搜索结果作为删除命令的输入。
find / -name test.sh | rm
然后马上这个程序员就要装x失败了。大家快鼓掌:
但是,其实他的想法是正确的。下面给出正确答案:
rm -f $(find / -name test.sh)
话不多说,老师要敲黑板了!!!
前者试图将find命令的结果连接到rm命令中作为标准输入,而后者则是将find的结果作为命令行参数传入。
注意了:
管道符和重定向符号是将数据作为标准输入的,这里我们举个例子:
ps -ef | grep xxx
这个命令相信大家都很清楚(不知道的老哥请重修Linux),这里就是讲ps出来的进程数据作为标准输入,然后grep命令来查找符合xxx条件的进程。这就是一个作为标准输入的例子。
而$()将数据作为参数
好吧,这里我们还是举个例子吧,方便大家理解;这里就用一个echo today is $(date "+%Y-%m-%d")
这个例子就是输出当前日期。而$()就是当前日期作为了一个参数传入echo 输出命令中。
总结一下,rm命令肯定是不能将数据作为标准输入的,而是应该讲输入作为参数传入,然后进行删除。换言之,就是rm命令不接受标准输入,而是接受命令行参数。
下面是吃一堑长一智的环节,大家要记清楚了!
下次遇到这样的情况我们怎么辨别哪些命令是接受标准输入,哪些命令接受命令行参数?
答案是:如果命令能够让终端阻塞,说明该命令接收标准输入,反之就是不接受,比如你只运行cat
命令不加任何参数,终端就会阻塞,等待你输入字符串并回显相同的字符串。
最后说明一下,我不是大佬,我是个 菜鸟,这些都是我自己在学习过程中,一点点总结出来的,如果有总结不到位或者有错误的地方,还希望大佬们能够指教。不管写得好不好都希望各位大佬能指点指点,或者扩展一下。