分页: 1 / 1

闲得无聊...研究脚本自修改

发表于 : 2013-07-26 13:53
liushengqi000
a.sh

echo ... > a.sh
echo ... >> a.sh
sed -i ... a.sh
cat a.sh|sed ...>a.sh
cat a.sh|sed ...>>a.sh

>> 基本都是文件追加,追加内容被执行
sed -i是文件被修改,执行内容不变
>为啥有时执行有时就没执行...sed>有时还会出意料外的文件结尾OTZ

Re: 闲得无聊...研究脚本自修改

发表于 : 2013-07-31 21:57
枫叶饭团
没明白

Re: 闲得无聊...研究脚本自修改

发表于 : 2013-09-03 22:27
millenniumdark
同沒看明白。

以前我倒試過自修改,配置選項直接寫在腳本裏,然後提供命令行參數通過修改自身文件的方式來修改配置。

Re: 闲得无聊...研究脚本自修改

发表于 : 2013-09-08 15:21
needle
sed都不能运行~

即使修改成可以运行,
读取文件,经过Sed修改后 重定向 到原文件,会出问题的!

Re: 闲得无聊...研究脚本自修改

发表于 : 2013-09-08 17:49
ceclinux
没执行的是报错了吧,>只redirect标准流的

Re: 闲得无聊...研究脚本自修改

发表于 : 2013-09-08 22:35
millenniumdark
needle 写了: 读取文件,经过Sed修改后 重定向 到原文件,会出问题的!

代码: 全选

sed -i

Re: 闲得无聊...研究脚本自修改

发表于 : 2013-09-09 12:05
YeLee
重定向不可预测的数据,不是都要异步写入的么? :em01

Re: 闲得无聊...研究脚本自修改

发表于 : 2013-09-10 22:57
needle
我去~,我以为你要把三个点重定向一个文件~,我说 sed -i ... a.sh怎么会运行不了呢 :em03
不想是省略号啊~

是这样的:

cat一行,传进管道,此时,(cat的)输入流(读取文件的流)并没有关闭,
经sed修改后,重定向到源文件(重定向会打开一个输出流写入原文件)
输入流跟输出流同时操作同一个文件,会出现竞争,结果是 导致文件内容最终清空!
也就是楼上讲的:
重定向不可预测的数据,不是都要异步写入的么?
要修改可以这样(如果非要写成一行的话):

代码: 全选

content=$(cat a.sh) && echo "$content" | sed ... >a.sh
另外:
有些命令会有一个输出选项,如sort有-o,iconv有-o就是为了解决重定向到原文件的问题。

再另外:
经sed的-i的修改后的文件已经不是原来的文件了,验证的话,你可以查看修改前后 文件的inode,已经改变了!
还有vim等编辑器的保存也是会改变文件的inode的哦!

这也就解释了,为什么,运行中的tomcat,删除catalina.out后再建catalina.out或修改了catalina.out后就没有日志了,而一定要重启tomcat。
因为运行中的tomcat保存的是catalina.out的旧inode。
且只有重定向会保持文件的原始性~,因为它不读取,只输出!

这是我以前对bash的研究。
:em03