现在的位置: 首页 > 综合 > 正文

Linux使用技巧

2013年03月03日 ⁄ 综合 ⁄ 共 2493字 ⁄ 字号 评论关闭

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扩大一倍看看有无解决。 

    -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指通过这个选项来生成与位置无关的代码,可以在任何地址被连接和装载

抱歉!评论已关闭.