tee用法
描述:从标准输入中读取并同时写入到标准输出和指定的文件上
选项:
-a,--append:不覆盖,而是追加输出到指定的文件中
-i,--ignore-interrupts:忽略中断信息
若指定的输出文件为'-',则再次输出到标准输出上
实例:
tee Example.txt #将标准输入中输入的内容同时输出到Example.txt和标准输出上
实践:
例如 ifconfig | tee ifconfig.log
查看iconfig.log
注:
标准输入一般有键盘和其它文件,标准输出有屏幕等。tee只能进行标准输入的输出,对于错误输入是不能输出的。
在调试脚本时,想要每个命令的执行过程都输出到屏幕或者文件中,以便后续查看,如何 *** 作呢?首先脚本第一行要写为“#!/bin/bash -x”,这样会把每个命令的执行记录都输出到屏幕,若还要输出到指定文件,要用到tee,但tee只能进行标准输入,对于标准输入和错误输入要用到下式:
./filename.sh 2>&1 | tee output.log 或者直接 bash -x ./filename.sh 2>&1 | tee output.log
今天调试一个bash,要把屏幕的输出结果存到log文件中,开始输入$bash -x ./test.sh >log 结果发现log里只存放了程序的执行结果,后来在cu的一篇帖子里http://bbs.chinaunix.net/viewthread.php?tid=264380&highlight=bash得到了启发,bash -x的调试信息是输出到2号流中的,所以解决方案为bash -x ./test.sh 2>&1 | tee log 想起以前要存放执行make的结果时也遇到类似问题,总结如下:
1、管道符的“I”的作用只是把前一个程序的标准输出流(stdout)的数据作为后一个程序的标准输入流stdin的数据,如不进行重定向,则其他输出流的信息是无法传给后面的程序的
2、屏幕得到的信息不一定是从程序的标准输出来的,也包括标准错误输出流stderr中的信息
3、有些程序(特别是象bash、make这样执行了其他程序的程序)的设计者为了省事,把一些正常情况的信息也放在stderr中输出(即使程序本身并无错误),而stdout用来输出被调用程序的执行时信息,造成了用户的误解简单编写了一下脚本,通过ssh登陆在命令行下运行正常,可是将脚本添加到crontab中就不正常。想记录一下输出信息,分析一下错误原因。将脚本通过使用>info.log 重定向输出,结果发现一些在命令行下可以看到的文本信息没有记录到info.log文件中,研究了一下,那些输出估计是输出到了标准错误上。
研究了一下通常添加命令后面几个输出含义
■ >/dev/null 输出到空设备,表示丢掉输出信息。
■ 2>&1将输出到标准错误的信息输出到标准输出设备(通常是屏幕)有3个默认的i/o,
■ 0是标准输入,一般是键盘
■ 1是标准输出,一般是屏幕
■ 2是标准错误,有时候屏幕上可以看到,但是重定向的文件中看不到的就是它了
分类: 电脑/网络 >> *** 作系统/系统故障问题描述:
注册表与应用程序之间是怎样的一种关系?
程序在安装时对注册表做了哪些修改?
这些修改的作用是什么?
解析:
就像是你办一个公司,要到相关部门注册登记一样,这样你的公司运行起来才合法。人家才不会找你的麻烦,才不会出现错误。程序也一样啊,你安装的时候要在系统的注册表里面登记,这样在你运行程序的时候,系统会记录相关的数值,保证程序正常运行。
你要知道绿色软件是怎么做的,是吧,那就仔细阅读下面的方法。
下面讲一下绿色软件的制作,简称软件的"绿化",绿色软件的制作实际上就是我们自己完成安装程序的工作。没有什么固定的方法,基本上是猜测加上试验,不同类别的绿色软件分别有不同的制作策略。 拿到一个新的软件,想要制成绿色软件的话,一般遵循如下步骤:
一、判断。就是指猜测这个软件能不能制成绿色软件,从功能,从你对它的了解,如果你觉得这个软件和系统的关系非常紧密,就不要继续下去了,还是用原始的安装程序最保险最方便,这样的例子有directx9 ,IE6,Norton的反病毒软件等等。这样的判断可以节省你的时间,当然你可以忽略这一步,尝试制作绿色软件,那么就转到第2步。
二、"绿化"。对于不同的软件有不同的方法,没有一定的规则,但是总的来说,就是理解软件的安装过程,转换为绿色安装,在这个过程中,可能需要尝试多个方法,也可能最后由于软件的复杂性或者某些特性,导致无法绿化。要有失败的思想准备,具体的绿化方法随后讲述。
三、测试。"绿化"后的测试最好到你个全新安装的 *** 作系统中测试,而且如果你要在多个 *** 作系统中使用这个软件的话,还要在其他的 *** 作系统中测试,有的软件的文件随着 *** 作系统的不同而不同,这个时候你需要在不同的 *** 作系统中进行"绿化"过程,最后综合为一个完整的适应多个 *** 作平台的绿色软件。 "绿化"方法,需要根据经验选择不同的"绿化"方法,也可能需要不断尝试不同的方法,直到成功为止。按照先易后难的次序,具体的方法包括:
1 解压缩。这是最简单的一种方法,就是指尝试能不能直接解开软件的压缩包。用Winzip和Winrar试一试,看看能不能直接打开压缩的安装文件,如果不能打开,那么就换别的方法。如果可以,那么恭喜,这个软件多半是属于绿色安装的软件(有个别例外,如EmEditor),把压缩包中的文件直接解压到目标路径,然后测试软件的功能是否正常,如果功能正常,那么"绿化"就成功了,如果使用不正常,那么就换别的方法。这一类软件的特点是安装程序的工作完全可以由软件自身来完成。
2安装然后卸载。也是比较容易的方法,完全是体力劳动,就是指直接安装这个软件,然后把程序复制出来,最后卸载安装程序。如果这个软件的安装程序的作用仅仅是复制文件和生成快捷键等工作,那么就属于绿色安装,可以使用这个方法。最后测试软件的功能是否正常,如果功能正常,那么"绿化"就成功了,如果使用不正常,那么就换别的方法。
3 反编译安装程序。这个方法需要动脑筋,就是根据安装程序所用的制作工具,选择相应的反编译程序,然后阅读反编译出的安装脚本,制作绿色软件。目前的软件大多使用专门的安装工具制作,如InstallShield,Wise,Inno Setup,Windows Installer,NSIS(Nullsoft),Installer VISE,其中Windows Installer格式的安装文件(就是MSI,MST为后缀的文件),可以通过微软的免费工具Orca打开查看,InstallShield格式的安装文件也有很多免费的工具可以解压缩和查看脚本。当然专门的安装工具很多,有许多安装程序没有相应的反编译程序,这种时候,就无法使用这个方法了。
4 观察反安装程序和log文件。现在的软件安装完成后绝大多数都带有卸载方法。卸载是安装的逆过程,如果知道怎么卸载,那么也可以推测出如何安装。由专门的安装工具制作的反安装程序,一般都是根据某一个文件中的信息来卸载的,可以用一个纯文本的编辑器打开这个文件。个别情况下这个文件完全不包含可读信息,就只好换用其他方法了。具体过程就是先采用方法2,然后理解反安装过程,最后根据反安装的信息制作绿色软件。
5 比较系统快照。当前面的方法都失败的时候,可以试一试这个方法。具体思路就是首先在安装软件之前,把系统的状态记录下来,主要包括注册表和系统目录的所有的文件状态。然后就是安装软件。安装完成后,再一次记录系统状态。最后就是比较前后两个系统状态的不同,而得知安装程序所做的工作。这个工作一般由专门的软件完成,如免费工具Regshot,免费工具inctrl5(pcmag/article2/0,4149,9882,00),微软公司的sysdiff工具(可以从Windows2000的资源工具箱中得到),或者WinInstall LE(在Windows 2000 Sever 光盘的目录VALUEADD\3RDPARTY\MGMT\WINSTLE\中)。在多数时候,仅仅需要对比安装前后注册表的不同,这时候还有大量的注册表工具可以选用。在得出系统差异后,把差异分解为两个部分:文件部分和注册表部分。文件部分指的是向系统目录拷贝的文件,以及作为COM组件注册的文件,还有与这些文件相关的注册表部分。注册表部分单单指其余的注册表的变化。对于文件部分,可以进一步区分出必须要往系统目录拷贝的文件(这种情况是少数)和可以放在软件的安装目录的文件。对于注册表部分,区分出由这个软件的安装程序本身所作出的注册表 *** 作和注册COM组件时候的注册表 *** 作,抛弃其他程序(如资源管理器Explorer)的 *** 作。根据所有这些,写一个拷贝文件,注册COM组件和导入注册表的批处理文件,就可以完成绿色软件的制作了。当注册表文件中含有路径信息的时候,可以手工修改注册表文件或者把注册表文件转化为INF文件从而实现全自动的路径处理。
6 直接导出注册表,寻找自注册的COM组件。这个方法是上面的方法5的简化版,现在软件的配置大多写在注册表中的"HKEY_LOCLAL_MACHINE \SOFTWARE\软件公司名字"和"HKEY_CURRENT_USER\SOFTWARE\软件公司名字"这2个键下面,直接对把这2个注册表键导出到REG文件中。自注册的COM组件都需要导出如下4个函数:DllCanUnloadNow,DllGetClassObject, DllRegisterServer, DllUnregisterServer,可以用vc自带的depend.exe找出哪一个动态链接库是自注册的COM组件。最后写一个批处理文件用 regsvr32.exe注册COM组件和用regedit.exe导入注册表。通过上面分析安装程序的动作,把安装程序的工作分解为复制文件,注册COM组件,安装服务驱动,注册表配置等几个部分,虽然注册表配置可以覆盖注册COM 组件,安装服务驱动等 *** 作步骤,但是把这些明显分割出来有助于制作绿色安装的软件。对于需要更复杂的步骤来安装的软件,还是使用原来的安装程序比较保险。
具体事例 :
winrar3.30 和Winzip9.0,采用方法1,解压缩。这个方法非常简单,从天空软件站下载Winzip90.exe和winrar330sc.exe,在一个安装了Winrar的系统上,用鼠标右键选择下载的文件,运行右键菜单中的用Winrar打开的命令,然后把文件解压到我们的目标路径,如E:\tools目录,就可以了。然后分别对Winzip9和Winrar进行设置就可以了。运行winzip9目录中的Winzip32.exe,进行winzip的设置。Winrar也是一样,运行Winrar.exe,打开菜单选项-〉设置,d出一个对话框,选择标签--集成,逐项对Winrar设置。当拷贝到U盘而到新的机器上运行时,需要重复这些设置过程。这一类软件的特点是安装程序的工作完全可以由软件自身来完成,从而完全抛开安装程序,或者说安装程序的工作也就是解压缩。类似的软件还有一些,最简单的测试办法就是看看Winrar能否直接打开压缩的安装程序。也可以采用方法2,过程基本上和方法1一样。方法2就不具体说明了,仅仅指出有许多程序属于这个类别,如Myie2,GreenBrowser,qq,BPFTP Server,IDA_Pro_Standard_4.5.1.770,FinalData,EASYRECOVERY 6.03,腾逊公司的TM等。
flashget是大家用得比较多的一个软件,可以多线程下载并且下载管理的功能也很方便,从天空软件站sky下载flashget1.60a 国际版,运行一下,然后取消安装。从上可以看出flashget1.60a国际版是使用Wise制作的安装程序,从网上下载wungui程序,非常容易的把安装程序解压缩到一个目录中,观察Maindir目录,其中有两个DLL文件Jccatch.dll和fgiebar.dll,进一步察看这两个动态库文件的导出函数,可以知道这两个DLL文件都是自注册的COM组件,写一个批处理文件install.bat来注册这两个DLL: REGSVR32 JCCATCH.DLL /s REGSVR32 fgiebar.dll /s 经过测试,功能正常,并且可以从浏览器IE中用鼠标的右键菜单激活flashget,功能完全,下面考虑卸载过程。
运行Regedit.exe,发现flashget在注册表中的路径是[HKEY_CURRENT_USER\\Sofare\\JetCar\\JetCar],写一个注册表文件unflashget.reg删除这个路径,如下:
REGEDIT4 flashget [-HKEY_CURRENT_USER\\Sofare\\JetCar\\JetCar] 同时写一个批处理文件uninstall.bat来卸载这两个DLL文件并导入unflashget.reg: Regedit unflashget.reg /s REGSVR32 JCCATCH.DLL /s /U REGSVR32 fgiebar.dll /s /U 随后就是删除一些我们用不到的文件,比如language目录的绝大多数欧洲的语言文件,这时候这个绿色版本就做好了。把制作好的绿色的flashget 拷贝到U盘上,需要用的时候,直接执行里面的install.bat文件就可以了(注意,要在flashget的目录运行批处理文件),不需要任何文件拷贝。我看到有人提到用优化大师提取falshget的注册表,然后直接导入注册表来制作绿色的flashget,这样做是不行的,从我前面的步骤来看,注册2 个DLL文件必然在注册表中引入了绝对路径,那么如果直接提取注册表的话,就必须根据当前的路径来修改注册表中的路径,否则的话制作的绿色版的 flashget只能在固定的目录运行。在制作flashget绿色版的时候,我同时使用了方法3和方法6,使用方法3的目的就是避免安装程序对系统作的修改,这样可以直接在当前系统进行测试,而不需要到另外一个没有安装过flashget的系统测试。 Emeditor是方法1的一个反例。Emeditor可以从开发商主页emurasoft/下载,是一个简单好用的文本编辑器,支持多种配置,自定义颜色、字体、工具栏、快捷键设置,可以调整行距,避免中文排列过于紧密,具有选择文本列块的功能 (按ALT 键拖动鼠标),并允许无限撤消、重做,总之功能多多,使用方便,是替代记事本的最佳编辑器。下载emed404epx.exe后,发现用Winrar可以打开,解压后,运行Emeditor,发现丢失了预定义的多种文本格式的语法配置,看来这样做不行,只好采用方法5了。请随我一步步进行,步骤如下:
1 扫描系统,制订系统快照。这里我仅仅记录当前系统的注册表(因为我认为Emeditor不会向系统目录拷贝文件,如果判断错误,就会导致"绿化"失败),运行ART(Advanced Registery Tracer),扫描一遍注册表。不要关闭ART。
2 安装Emeditor。随便安装到哪里,反正一会就卸载。安装好后,如果需要的话,更改配置,或者配置新的文件类型,例如我就增加了NFO文件类型,设定和NFO文件相关联的字符集,这样可以用Emeditor直接察看NFO文件,不需要专门的察看工具了。
3记录系统变化。再一次扫描系统,给系统作快照,从ART里面再一次扫描注册表,然后选择菜单命令Registry-〉pare here或者直接用键盘F10,点击那个save to redo file的按钮,存储为Emeditor.reg文件,关闭ART。
4 复制并卸载。复制安装好的Emeditor目录到其他路径,然后卸载Emeditor程序。
5 分析。打开刚刚导出的Emeditor.reg文件,这是一个巨大的reg文件,单单是REG文件就有1兆多,不过不用担心。阅读注册表后,删除和 emeditor无关的注册表项后,如仅仅和资源管理器相关的注册表部分,发现剩下的注册表文件可以分成3个部分。一部分在位于注册表的这个路径 [HKEY_LOCAL_MACHINE\\SOFTWARE\\EmSoft],里面大部分不涉及路径,只有一项记录了Emeditor的路径,就是\ "ModulePath\"=\"h:\\\\EmEditor4\\\\\";还有一大部分在注册表的这个路径下面 [HKEY_CURRENT_USER\\Sofare\\EmSoft\\EmEditor v3],里面有很多项都涉及了Emeditor的路径,如\"Tmpl\"=\"h:\\\\EmEditor4\\\\template.xml\";还有就是和Emeditor和txt文件后缀向关联的注册表设置,把Emeditor设置为IE中缺省的源代码察看工具的注册表设置以及注册COM组件 EMEDSHL.DLL的注册表部分(和InProcServer32相关的就是)。
6 "绿化"。
1) 把位于注册表路径路径[HKEY_LOCAL_MACHINE\\SOFTWARE\\EmSoft]的内容存储到emeditor_HKLM.reg文件中,把位于注册表路径[HKEY_CURRENT_USER\\Sofare\\EmSoft\\EmEditor v3]的内容存储到emeditor_HKCU.reg文件中,把剩下的内容首先除掉COM组件EMEDSHL.DLL的相关部分,然后存储到 emeditor_assoc.reg文件中。
2) 把emeditor_HKLM.reg文件和emeditor_HKCU.reg文件中涉及到路径的注册表内容抽取出来,存储到emeditorConf.reg文件。
3) 把emeditor_assoc.reg文件和emeditorConf.reg文件用INF的语法转换为INF文件,或者用一个免费小工具 reg2inf.exe自动转换,然后把转换得到的emeditor_assoc.inf文件和emeditorConf.inf文件中的路径h:\\ EmEditor4全部用%01%代替。下面是emeditorConf.inf文件的内容:
[Version] Signature=\"CHICAGO\"
[DefaultInstall] AddReg=EmeditorConf_AddReg
lm,\"SOFTWARE\\EmSoft\\EmEditor v3\\Common\",\"ModulePath\",,\"%01%\\\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\C++\",\"Tmpl\",,\"%01%\\template.cpp\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\CSS\",\"Tmpl\",,\"%01%\\template.css\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\HTML\",\"Tmpl\",,\"%01%\\template\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\Java\",\"Tmpl\",,\"%01%\\template.java\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\javascript\",\"Tmpl\",,\"%01%\\template.js\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\JSP\",\"Tmpl\",,\"%01%\\template.jsp\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\Perl\",\"Tmpl\",,\"%01%\\template.pl\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\PHP\",\"Tmpl\",,\"%01%\\template.php\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\Python\",\"Tmpl\",,\"%01%\\template.py\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\Ruby\",\"Tmpl\",,\"%01%\\template.rb\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\TeX\",\"Tmpl\",,\"%01%\\template.tex\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\VBScript\",\"Tmpl\",,\"%01%\\template.vbs\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\VBScript for EmEditor\",\"Tmpl\",,\"%01%\\template.vbee\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\Windows Script\",\"Tmpl\",,\"%01%\\template.wsf\"
cu,\"Sofare\\EmSoft\\EmEditor v3\\Config\\XML\",\"Tmpl\",,\"%01%\\template.xml\"
** 写一个批处理文件install.bat,内容如下:
regedit emeditor_HKLM.reg
regedit emeditor_HKCU.reg
RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 128 .\\emeditorConf.inf
regsvr32 EMEDSHL.DLL
RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 128 .\\emeditor_assoc.inf '
4) 把install.bat,emeditorConf.inf,emeditor_assoc.inf,emeditor_HKLM.reg,emeditor_HKCU.reg5个文件存储到Emeditor的目录,删除其余的注册表文件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)