bash暗黑破坏神(2)
时间:2005-09-03 来源:slimzhao
1. 不要用shell变量来保存二进制数据, 也不要用函数参数来作传递, 至今我还没看到严肃的声明说可以这样
2. xxd 是个名不见经传的工具, 但比它更闻名一些的od却不能把字符描述的进六进制反转成二进制数据.
xxd 来自vim安装包, 我在windows下安装完gvim也有一个伴随的xxd, 当你想生成一个数据量不大, 但内容却希望
随心所欲的时候, 它显得尤其有用
echo 410000000000000000000000 | xxd -r -ps > tmp.dat
你的tmp.dat第一个字符将会是A, 但其后的就都是真正的ASCII为0的字节.
3. tr 是为数不多的不跟文件名作参数的命令, 它只遵循一个原则, 从stdin读, 向stdout写.
4. 如何在用grep 取到目标串时获知它在文件中的准确偏移, 麻烦:
grep -ab regexp filename.txt
输出的格式是
123:pre - regexp - post
这个123只是这一行在文件中的偏移, 不是被找到的那个regexp, 你还得把这一行存起来, 想办法把regexp前面的部分长度求出来.
加上去. 总之是麻烦.
5. 如何改变某个文件中的其中一个字节
找到偏移处, 用 echo 03 | xxd -r -ps > tmp.dat 把要写的字节存入一个文件.
dd if=tmp.dat of=file.dat bs=1c seek=1000 conv=notrunc
最后一个参数是要命的, 否则你的输出文件 file.dat将会被截为0先.
6. 在DOS下编程注意什么
binmode(stdin), 不管是在perl中, C语言中都要注意这一点. 它的文件是区分文本方式和二进制方式的.
但运行了bash.exe作为命令解释器之后约定就跟UNIX是一样的了.
在DOS下把多个文件合并成一个的办法是:
copy /b file1+file2+file3 all_in_one
在UNIX下是
cat file1 file 2 file3 > all_in_one
7. 小心很多命令, 它们不是被设计成二进制数据的.
8. printf 可以把一个整数显示出来, 但我如何把它作为一个native的int存储在INTEL体系结构的机器中?
printf "%08x" 1234 | rev | sed 's#(.)(.)#21#g' | xxd -r -ps > tmp.dat