解释器文件的参数问题(!/usr/bin/sed -n -f为什么报错)

由问题引出讨论,这次的问题是:

 

 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程序如下:

 

 

 

,程序运行如下:

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值