我为bash脚本专家准备了一个小难题……我有一个bash脚本,它需要在运行时创建一个小的(80字节)二进制文件。文件的内容需要包含在脚本本身中(即,我不想只将文件与脚本一起打包)。
我的脚本目前是这样做的:
echo 'begin-base64 644 dummy.wav' > /tmp/dummy.uu
echo 'UklGRkgAAABXQVZFZm10IBAAAAADAAEAAHcBAADcBQAEACAAZmFjdAQAAAAAAAAAUEVBSxAAAAAB' >> /tmp/dummy.uu
echo 'AAAAQDYlTAAAAAAAAAAAZGF0YQAAAAA=' >> /tmp/dummy.uu
echo '====' >> /tmp/dummy.uu
uudecode -o /tmp/dummy.wav /tmp/dummy.uu
rm /tmp/dummy.uu..。在上面的运行之后,我得到了我的文件/tmp/dummy.wav。但是我刚刚发现运行这个脚本的计算机没有安装uudecode (并且我没有被允许安装它),所以我需要找到一些其他的方法来创建这个文件。有什么想法吗?
发布于 2010-06-26 08:52:52
一些安装程序会做类似这样的事情:
#!/bin/bash
tail -n +4 $0 | tar xvzf -
exit
<tgz file appended here><newline>发布于 2010-06-26 09:24:36
如果目标计算机具有可用的perl:
perl -ne 'print unpack("u",$_)' > dummy.wav <<EOD
M4DE&1D@```!7059%9FUT(!`````#``$``'<!``#<!0`$`"``9F%C=`0`````
C````4$5!2Q`````!````0#8E3```````````9&%T80``````
EOD这是使用您在原始计算机上执行uuencode dummy.wav < dummy.wav时获得的非base64格式。
如果做不到这一点,您总是可以这样做:
echo -ne '\x52\x49\x46\x46\x48\x00\x00\x00' > dummy.wav
echo -ne '\x57\x41\x56\x45\x66\x6d\x74\x20' >> dummy.wav
echo -ne '\x10\x00\x00\x00\x03\x00\x01\x00' >> dummy.wav
echo -ne '\x00\x77\x01\x00\x00\xdc\x05\x00' >> dummy.wav
echo -ne '\x04\x00\x20\x00\x66\x61\x63\x74' >> dummy.wav
echo -ne '\x04\x00\x00\x00\x00\x00\x00\x00' >> dummy.wav
echo -ne '\x50\x45\x41\x4b\x10\x00\x00\x00' >> dummy.wav
echo -ne '\x01\x00\x00\x00\x40\x36\x25\x4c' >> dummy.wav
echo -ne '\x00\x00\x00\x00\x00\x00\x00\x00' >> dummy.wav
echo -ne '\x64\x61\x74\x61\x00\x00\x00\x00' >> dummy.wav这一小段bash是用以下命令生成的:
$ hexdump -e '"echo -ne '\''" 8/1 "x%02x" "'\'' >> dummy.wav\n"' dummy.wav | sed 's;x;\\x;g;1s/>/ /'编辑后添加:正如在这里的回复中指出的,类似这样的事情也是一种可能性:
xargs -d'\n' -n1 echo -ne > dummy.wav <<EOD
\x52\x49\x46\x46\x48\x00\x00\x00\x57\x41\x56\x45\x66\x6d\x74\x20
\x10\x00\x00\x00\x03\x00\x01\x00\x00\x77\x01\x00\x00\xdc\x05\x00
\x04\x00\x20\x00\x66\x61\x63\x74\x04\x00\x00\x00\x00\x00\x00\x00
\x50\x45\x41\x4b\x10\x00\x00\x00\x01\x00\x00\x00\x40\x36\x25\x4c
\x00\x00\x00\x00\x00\x00\x00\x00\x64\x61\x74\x61\x00\x00\x00\x00
EOD(对于关闭xargs自己的反斜杠处理,-d参数很重要)
您还可以将我的十六进制转储命令中的8/1转换为80/1,并拥有一个很长的echo行。
发布于 2010-06-26 08:54:22
将exit放在脚本的末尾,将文件附加到脚本的末尾,然后使用tail -c 80获取内容。只要你不需要担心换行符的转换问题,这个方法就会起作用。
https://stackoverflow.com/questions/3122254
复制相似问题