1. 输出重定向
通常的命令执行结果的重定向可用:#command [option] > 或 >> filename;
其中,’>’与’>>’的区别为前都会清原来文件中的内容再写入,后者会增加在文件的后面而不清原来的内容。
如果对一个程序中的print等输出进行重定向,则应该在printf后面加下输出的刷新fflush(stdout),不然输出不会马上写入到重定向的文件里,因为重定向后输出只有满4K之后才会写入一次文件中。
编译时,使用:
autobuild > info.txt时, 会将编译信息输出到info.txt中,而错误信息(如果有)在终端中显示出来。
autobuild 2> error.txt时,只对错误信息导向输出到error.txt, 其它编译信息输出到终端。
autobuild >& error.txt时,将所有信息都输出到error.txt中,终端不输出任何信息。
2. diff 与 patch
在一个目录下存在原始的old和修改后的new文件或文件夹,使用以下命令生成diff文件
diff -Naur old new > diff.txt
使用patch恢复:
1), 如果old是文件夹,进入文件夹, 使用 patch -p1 <diff.txt 命令进行恢复。如果不进入old文件夹,使用patch -p0 <diff.txt进行恢复,但如果 new相对于old有新增加文件或文件夹时,使用这个命令时,会同时生成一个new文件夹,新增的文件或文件夹会在new中,这样就需要再将new中的所有内容copy到old中才完成恢复。
2), 如果 old和new只是文件,则在old所在目录使用patch -p0 >diff.txt 命令
3. linux find exec rm
#find ... -exec rm {} /;
#find ... | xargs rm -rf
两者都可以把find命令查找到的结果删除,其区别简单的说是前者是把find发现的结果一次性传给exec选项,这样当文件数量较多的时候,就可能会出现“参数太多”之类的错误,相比较而言,后者就可以避免这个错误,因为xargs命令会分批次的处理结果。这样看来,“find ... | xargs rm -rf”是更通用的方法,推荐使用!
rm不接受标准输入,所以不能用find / -name "tmpfile" |rm
-exec 必须由一个 ; 结束,而因为通常 shell 都会对 ; 进行处理,所以用 /; 防止这种情况。
{} 可能需要写做 '{}',也是为了避免被 shell 过滤
find ./ -type f -exec grep iceskysl {} /dev/null /;
./表示从当前目录找
-type f,表示只找file,文件类型的,目录和其他字节啥的不要
-exec 把find到的文件名作为参数传递给后面的命令行,代替{}的部分
-exec后便跟的命令行,必须用“ /;”结束
#find ./ -type f -name "*.cpp"|xargs grep "test" -n
#find . -name "*cpp" -exec grep "test" {} /; -print
4. cp -rf 隐藏文件
需要拷贝一个文件夹下的所有文件到另一个文件夹,包含隐含文件及隐含文件夹
cp -rf a/* b/
发现这样做不行,没有拷贝隐含文件,隐含文件夹
这样做才可以:
cp -rf a/. b/
cp命令的选项与参数:
-a 相当于 -pdr
-d 若源文件为link文件,则复制link文件属性
-p 连同档案的属性一起复制过去(rwx属性)
-r 递归复制,包括子目录
5 Makefile里的-l -L选项
-l-->指定连接时期望连接的库的名字
-L-->指定连接库的搜索路径
参见 LIBS += -Wl,-u,linuxu_app_preinit -lc -lrt -lpthread -ldl -lnlm -lfuse -L $(HPEXEC_INSTALL_DIR)/lib/
所以hyperexec连接时将优先连接libnlm.a里的实现,,如果在其中找不到实现,再去到newlib和libc中找实现。
例如你实现了一个库libxxxx.so, 要链接这个库时,必须用-L指定库所在的路径,并且用-lxxxx指定库名, 注意不是-llibxxxx。
如果库已经放在默认的搜索路径时,不需要-L
注意, 编译共享库时,需要加上-fPIC选项,-fPIC指通过这个选项来生成与位置无关的代码,可以在任何地址被连接和装载
6. ulimit 命令
使用ulimit -a命令可以查看ulimit设置,使用命令可以直接设置ulimit属性。
ulimit -s XXX 可修改线程stacksize (默认通常为8M). 当程序运行时遇到segmentation fault的错误时,要考虑是否发生stacksize overflow.
这时可用 ulimit -s 16384 将stacksize扩大一倍看看有无解决。