[Happy BASH] 关于BASH程序的输入方式小结
2012-10-26 18:28
411 查看
在*NIX环境中,内部命令或外部命令(Utility)支持以下三种输入方式:
1. 命令自己提供的输入参数,更准确地说是处理的对象,譬如AWK中的文件。不是那些控制参数。
2. 从STDIN输入。
3. 从文件重定向到STDIN作为输入。
对于2,用户每输入一行(ENTER键结束),程序就输出它。而3不同,看到重定向操作符,SHELL会将文件的输入重定向到STDIN中,作为命令的标准输入,所以对于程序来说,这个过程是透明的。程序一次性的读入文件的所有内容作为输入,然后处理,不管文件中有多少行。
PIPE(通道)提供了一种方式,将一个程序的STDOUT连接到另一个程序的STDIN,这样前一个程序的标准输出,后一个程序的输入就可以看到。管道连接的2个程序几乎是同时运行的,区别于&&或","连接的2个程序,而且标准输出默认是行缓冲输出的,所以说,前一个程序的一行输出,在后一个程序中标准输入中就可以看到一行输入。
而对于1,这个是程序特别的。程序需要什么样的输入参数,程序自己知道。在*NIX中,标准的输入是以WHITESPACE作为分隔符的。一般来说,程序是一个一个参数来处理的,所以程序就可以捎带N多输入参数,但是这个是在系统中是有限制的( getconf ARG_MAX)。我们可以通过xargs命令,然后连同PIPE将一个程序的输出,转化为一个标准的参数输入列表,只要某个程序支持标准的参数列表输入,那么用这种方式给程序提供参数输入就可行。譬如
当查找出来的文件中包含换行符时,我们需要为find命令加上-print0选项,将每项输出结尾的\n替换成NULL,然后在xargs命令中采用-0选项来将NULL作为输入项的分隔符。这样就能争取的得到每项的输入。xargs默认是以WHITSPACE作为分隔符。
同时-print0和-0选项的结合,可以消除文件中包含WHITESPACE的问题。
加入txt文件有2个"a b.txt"和"a.txt", find默认给出一行一个文件的输出。
需要说明的是,有些程序提供了“-” option,支持从标准输入中获取输入参数,譬如AWK程序
1. 命令自己提供的输入参数,更准确地说是处理的对象,譬如AWK中的文件。不是那些控制参数。
2. 从STDIN输入。
3. 从文件重定向到STDIN作为输入。
对于2,用户每输入一行(ENTER键结束),程序就输出它。而3不同,看到重定向操作符,SHELL会将文件的输入重定向到STDIN中,作为命令的标准输入,所以对于程序来说,这个过程是透明的。程序一次性的读入文件的所有内容作为输入,然后处理,不管文件中有多少行。
PIPE(通道)提供了一种方式,将一个程序的STDOUT连接到另一个程序的STDIN,这样前一个程序的标准输出,后一个程序的输入就可以看到。管道连接的2个程序几乎是同时运行的,区别于&&或","连接的2个程序,而且标准输出默认是行缓冲输出的,所以说,前一个程序的一行输出,在后一个程序中标准输入中就可以看到一行输入。
而对于1,这个是程序特别的。程序需要什么样的输入参数,程序自己知道。在*NIX中,标准的输入是以WHITESPACE作为分隔符的。一般来说,程序是一个一个参数来处理的,所以程序就可以捎带N多输入参数,但是这个是在系统中是有限制的( getconf ARG_MAX)。我们可以通过xargs命令,然后连同PIPE将一个程序的输出,转化为一个标准的参数输入列表,只要某个程序支持标准的参数列表输入,那么用这种方式给程序提供参数输入就可行。譬如
find . -name '*.pl' | xargs
当查找出来的文件中包含换行符时,我们需要为find命令加上-print0选项,将每项输出结尾的\n替换成NULL,然后在xargs命令中采用-0选项来将NULL作为输入项的分隔符。这样就能争取的得到每项的输入。xargs默认是以WHITSPACE作为分隔符。
find ./ -name '*.txt' -print0 | xargs -0 -n 1 cat
同时-print0和-0选项的结合,可以消除文件中包含WHITESPACE的问题。
加入txt文件有2个"a b.txt"和"a.txt", find默认给出一行一个文件的输出。
$ find ./ -name '*.txt' ./a b.txt ./a.txt输入到xargs中,它会默认按照WHITESPACE分隔,比如:
$ find ./ -name '*.txt' | xargs -n 1 ./a b.txt ./a.txt $ find ./ -name '*.txt' | xargs -n 2 ./a b.txt ./a.txt $ find ./ -name '*.txt' | xargs -n 3 ./a b.txt ./a.txt-n 是将输入中的多少个项组成一个参数列表。所以如果那 xargs输出的参数列表来执行其他命令,大多数会失败,因为有些项已经被WHITESPACE分隔开了。
需要说明的是,有些程序提供了“-” option,支持从标准输入中获取输入参数,譬如AWK程序
awk 'print' a.txt -先处理a.txt,然后再循环处理标准输入。
相关文章推荐
- Qt中关于无法定位程序输入点的一种问题解决方式
- 关于“无法定位程序输入点gzdirect于动态链接库zlib1.dll”的问题
- 关于输入流(从硬盘文件输入到程序中)
- 关于“无法定位程序输入点getaddrinfo于动态链接库WS32_32.dll上”的问题
- 关于无法把程序(Adobe Fireworks CS5)添加到打开方式的解决办法
- (Ubantu)使用gcc编译一个程序a.c成a.out,输入a.out运行,提示bash:a.out:command not found,怎么回事
- Linux 后台输入命令及后台运行程序 nohup 命令 小结
- 关于STM32F407ZGT6的一些知识小结及串口1程序
- 关于在asp.net中使用showDialogModal方式输入数据中存在的问题
- linux中程序/脚本启动方式小结
- C# 关于开机自动运行程序方式之一
- 编写程序通过栈的方式将任意输入的字符串内容进行逆序输出。
- 20_Android中apk安装器,通过WebView来load进一个页面,Android通知,程序退出自动杀死进程,通过输入包名的方式杀死进程
- 关于汇编的基本小程序——将输入字符串中的小写字母转换成大写字母并输出
- 关于强制程序以管理员方式运行的方法
- 关于“无法定位程序输入点getaddrinfo于动态链接库WS32_32.dll上”的问题
- 关于Nod32把病毒码定位到程序的iat输入表的API
- 编写程序通过栈的方式将任意输入的字符串内容进行逆序输出。
- 20_Android中apk安装器,通过WebView来load进一个页面,Android通知,程序退出自动杀死进程,通过输入包名的方式杀死进程
- 暗潮:微信小程序第三弹:关于微信小程序吸粉方式的可行性分析