【发布时间】:2016-06-25 16:03:16
【问题描述】:
我试图编写一个 shell 脚本来创建另一个以 base64 压缩和编码的自解压 tar 存档。我不知道从哪里开始,并且几乎没有 shell 脚本编写经验。
正如这个脚本创建压缩和编码的 tar 存档一样,但是当我尝试从终端运行 ./tarName 时,自解压不起作用。任何建议表示赞赏
#!/bin/sh
tarName=$1;
if [ -e $tarName.tar.gz ]
then /bin/echo "$tarName already exists"
exit 0
fi
shift;
for files;
do
tar -czvf tmpTarBall.tar.gz $files;
done
echo "#!/bin/sh" >> $tarName.tar.gz;
echo "base64 -d $tarName.tar.gz" >> $tarName.tar.gz;
echo "tar -xzvf $tarName.tar.gz" >> $tarName.tar.gz;
chmod +x ./$tarName.tar.gz;
base64 tmpTarBall.tar.gz >> $tarName.tar.gz;
rm tmpTarBall.tar.gz;
---------更新
环顾四周,这就是我现在所拥有的,但仍然无法正常工作。谁能给我解释一下为什么?
#!/bin/sh
tarName=$1;
if [ -e $tarName.tar.gz ]
then /bin/echo "$tarName already exists"
exit 0
fi
shift;
for files;
do
tar -czvf tmpTarBall.tar.gz $files;
done
cat > extract.sh;
echo "#!/bin/sh" >> extract.sh;
echo "sed '0,/^#TARBALL#$/d' $0 | $tarName.tar.gz | base64 -d | tar -xzv; exit 0" >> extract.sh;
echo "#TARBALL#" >> extract.sh;
cat extract.sh tmpTarBall.tar.gz > $tarName.tar.gz;
chmod +x ./$tarName.tar.gz;
rm extract.sh tmpTarBall.tar.gz;
当我尝试运行 tarName.tar.gz 时出现错误: ./tarName.tar.gz: 2: ./tarName.tar.gz: tarName.tar.gz: 未找到 gzip:标准输入:文件意外结束 焦油:孩子返回状态1 tar:错误不可恢复:现在退出
【问题讨论】:
-
exit 1出现问题时 —exit 0表示成功。您应该只用tar -czvf tmpTarBall.tar.gz "$@"替换for循环,以将所有文件放入一个tarball。c选项每次都会创建一个 tar 文件;因此,您只存储了列出的最后一个文件。 -
你需要仔细考虑生成的 shell 脚本应该是什么样子,因为这将决定你的 shell 脚本必须做什么来创建它。您当前提出的命令行在许多方面都令人怀疑,尤其是因为您无法在正常的事件过程中通过 gzip 压缩的 tar 文件传输数据。总的来说,您可能应该使用
-b num选项在base64的编码输出上设置行长(这在Mac OS X 上是正确的;GNU 版本有可能使用不同的选项)。
标签: shell unix scripting tar self-extracting