最近工作中用到的一些Linux小技巧,比较零散,所以没有分类整理,可能看起来比较麻烦。
查询某个RPM包依赖的包。-qR这么有用的参数rpm --help里面居然没有写!(仅写了长格式 --requires )
rpm -qR coreutils
创建RPM包时的两个有用的设置:
# 防止创建带调试信息的RPM包
%define debug_package %{nil}
# 打包之前不要对目标文件做strip(如打包脚本时没必要strip)
%define __os_install_post %{nil}
# 禁止自动搜索依赖关系
Autoreq: no
Autoprov: no
关于sed:sed正则表达式中的 . 符号匹配对象并不是“任意字符”而是“任意可显示的英文字符”, 包括英文字母、数字、特殊符号、空白等,但不包括0-31的控制字符和127以后的特殊字符。 因此在匹配非英文字符时要当心,虽然多语言版能匹配绝大部分的非英文字符,但也有特例。 目前发现 euc-jp 编码下的日文字符大部分都不能被匹配。例如:
$ cat japanese テスト test 添付ファイル $ sed -e 's/.*/__&__/' < japanese ____テスト __test 添__付ファイル
另一个使用sed的简单脚本,实现类似grep的功能,但它将匹配的行用特殊颜色显示:
# cat mgrep #!/bin/sh sed -e "/$1/s/.*/\x1b[0;30;43m&\x1b[m/"
如何将文件比较结果直接输出到vim中(因为vim有语法高亮):
$ diff foo bar | vi -
另外Fenng最近提到的一篇关于防止 rm -rf / 的文章也很有参考价值。
所谓交互式的rpm包,就是说在安装过程中接受用户输入,来完成诸如许可证确认、创建配置文件等工作。
首先要说明,不推荐使用rpm创建交互式安装包。rpm的设计目标就是在完全不需要用户干涉的前提下完成软件的安装、升级等工作,这样可以通过cron或者yum/apt/up2date等脚本完成自动安装和自动升级。而交互式rpm包将破坏这种特性。另外,通过图形界面安装rpm包时,交互式脚本将完全不能执行(因为没有终端)。因此,在rpm中执行脚本时,标准输入是被关闭的,也就是说你无法在rpm安装过程中获得任何用户输入。
但有时真的需要创建交互式rpm包,如迫于工作压力,或者创建内部使用的安装程序,或者作为产品分发给完全不懂计算机的用户等。虽然rpm中的脚本无法获取用户输入,但方法总是人想出来的。
我们知道在spec文件的%post节中可以书写bash脚本,而通过read命令可以获取用户输入。但如果在%post中使用read命令,你会发现read并不等到你输入而是直接就结束了。原因就是rpm安装时关闭了标准输入。我们可以手动将它重新打开,方法就是在read之前加入以下代码:
exec 6<&0 0</dev/tty # 将标准输入保存到6,然后在标准输入上打开/dev/tty read MYVAR exec 0<&6 6<&- # 恢复备份的标准输入并关闭6
当然标准输入(0)本身就是关闭的,所以不备份应该也无所谓。/dev/tty是指向用户控制台的一个链接,在命令行控制台和远程终端的情况下都可以正确使用。
这篇文章翻译自这里, 是一篇关于制作RPM包中的一个比较难于理解的地方。 不做开发的同学就不要看了。
阅读全文 »