我正在尝试查看tar
文件以进行更改,如果是,请提取文件,cd进入目录,然后构建,然后运行。
我所拥有的内容如下:
while [ 1 ]
do
checksum=`md5sum kinect.tar`
sleep 10
newsum=`md5sum kinect.tar`
if [ $newsum -ne $checksum ]
then
killall lebron
tar -zxf kinect.tar
cd kinect
make
./lebron &
fi
done
我偶尔会在[ has too many arguments
的行上遇到if
错误,但我不确定原因。我有什么好吗?你会建议一个替代解决方案吗?
答案 0 :(得分:1)
首先,您不引用您的变量。其次,-ne
用于比较数字,而不是字符串。请改用!=
:
if [ "$newsum" != "$checksum" ]
正如Ed Heal在他的评论中指出的那样,如果文件被原子地修改,该算法才有意义。保证这一点的最佳方法是,如果它是在一个地方生成,然后移到kinect.tar
。此外,如果在构建先前版本时修改了文件,则代码将无法捕获更改,这可以通过Ed Heal建议的以下更改来修复:
checksum=`md5sum kinect.tar`
while [ 1 ]
do
sleep 10
old_checksum=$checksum
checksum=`md5sum kinect.tar`
if [ "$old_checksum" != "$checksum" ]
真的,如果你有一个更好的方法来编写.tar
文件来与你的脚本进行通信,那将是最好的。例如,新的.tar
文件始终完全写入,然后移动到脚本检查的kinect-new.tar
并移至kinect.tar
。这避免了读取不完整文件的可能性和比较md5sums的混乱。 (你可能会更加漂亮并使用类似inotify-tools之类的内容来避免显式轮询,但这可能不值得付出努力。)
不幸的是,这并没有解决构建可能失败的问题(除非您使用的.tar
文件是已知的良好版本,在这种情况下,您似乎不太可能想要每个都检查一个新版本10秒)。您可能想要创建一个目录,在那里解压缩,只有在make
成功时才替换旧版本。有点像这样:
tar -zxf kinect.tar
cd kinect
if make
then
cd ..
rm -rf kinect.good
mv kinect kinect.good
cd kinect.good
killall lebron
./lebron &
fi
cd .. # make sure we always stay in the original directory
答案 1 :(得分:1)
您的一个问题是md5sum
会返回散列和文件名。你只想捕获哈希值。您可以使用带有重定向和进程替换的read
内置函数轻松完成此操作。
另外,既然你已经使用bash
作为翻译,那么你真的应该使用[[ ]]
而不是[ ]
而且前者的能力要强得多。
#!/bin/bash
while true; do
read checksum _ < <(md5sum kinect.tar)
sleep 10
read newsum _ < <(md5sum kinect.tar)
if [[ $newsum != $checksum ]]; then
killall lebron
tar -zxf kinect.tar
cd kinect
make
./lebron &
fi
done
答案 2 :(得分:0)
这是对上述@tekknolagi评论的回复 - 使用它来使响应更具可读性。
检查更新的脚本
checksum=`md5sum kinect.tar`
while [ 1 ]
do
sleep 10
newsum=`md5sum kinect.tar`
if [ "$newsum" != "$checksum" ]
then
# Inform you that the file has changed (email perhaps).
fi
我假设您通过网络(FTP?)接收tar文件。如果是这样,请执行以下操作
1)FTP到不同的文件名 2)FTP小尺寸(1字节)表示FTP已完成 3)修改上面的脚本以检查步骤2收到的文件。如果找到,删除它(或者更好地重命名它以使您能够轻松恢复),删除旧的kinect.tar文件。将文件从步骤1移动到位
或者
1)FTP到不同的文件名 2)获取FTP以删除kinect.tar 3)获取FTP将文件从1)移动到位。