由问题引出讨论,这次的问题是:
echo good|sed -f sed.sed
1. sed.sed: -n /good/p
2. sed.sed: /good/p
为什么第一种会报错呢
由这个问题引发下边的问题:
#!/usr/bin/sed -n -f为什么报错
=====================================
先回答第一个问题:
sed -f sed.sed 这种形式是将sed运行的cycle(程序体)从文件中导入,这里不涉及选项,全部都认为是程序
所以第一种报错了,因为这种情况相当于运行 sed ‘-n /good/p’,(注意,这里用了单引号),这是语法错误的
第二种相当于运行 sed '/good/p',这个当然没错,但无法具有-n的效果,
所以需要-n 和-f 的话,应该这么用:
echo good|sed -n -f sed.sed
其中 sed.sed: /good/p
======================================
引发的问题,涉及到sed脚本文件的执行方式:
sed脚本里第一行里的-n是无效的
一般的形式只是 #!/bin/sed -f
sed脚本有二种运行方式
1:第一种方式 在命令行里运行如sed -f scriptfile
2: 第二种方式 #!/path/sed -f 做为脚本文件第一行,将该文件chmod +x改成可执行,直接./scriptfile运行
第一种方式,scriptfile全文都是运行用的程序,
第一行就算有#!也只是注释,被忽略了(当然,如果程序对#起始不认为是注释则不是忽略)
需要其他选项时,要在命令行里加入,比如sed -i -n -f scriptname
同时记住,这种方式是第二种方式的基础。
第二种方式:是解释器文件调用形式,
解释器文件的调用机制是与exec程序族有关系,说起来又没完没了了,就简单说下解释器文件的实际运行结果
假如解释器文件scriptfile运行命令如下:
同时在解释器文件scriptfile第一行为
则实际命令类似第一种方式运行命令行:
其中:
optlist1 可是以多个展开的呵
optlist2 是做为一个参数传进去的
对于programname为sed ,awk等支持第一种运行方式的情况,就要求ptlist2 为-f
这也是为什么说脚本第一行里只能放-f选顶,加-n无效的原因
因为第一行为#!/usr/bin/sed -n -f,并通过第二种方式运行
实际的运行命令相当于:sed '-n -f' scriptfile optlist1 (再提醒一下这里的单引号)
这是错误的格式
应该把-n放在optlist1里
即: 解释器运行命令
同时scriptfile文件第一行为:
以上内容,参考自:apue 8.12
==============================================
列举几个相关的程序,有兴趣的做为扩展了解下:
c8.10用于模拟解释器文件运行方式,
调用execl执行/tmp/aa程序,
二个参数分别是:a1,a2
程序/tmp/aa内容如下:
由上可知,/tmp/aa是一个解释器文件,指向/tmp/echoarg程序,后带参数 -aa -bb
echoarg程序如下:
,程序运行如下: