Bash脚本退出时没有错误

时间:2013-06-14 11:15:00

标签: linux bash shell tar strace

我有一个bash脚本,我正在从DVD运行。此脚本将多卷tar文件从DVD复制到本地计算机。在复制过程中,脚本会提示用户插入第二张DVD,然后复制剩余的文件。该脚本存在于第一张DVD上,但不存在于第二张DVD上。

此脚本在复制最后一个文件之后,但在启动tar多卷提取操作和后续处理之前停止。没有报告错误或消息。我尝试用'-x'运行bash,但没有什么可疑的 - 甚至不是退出声明。更不幸的是,这种行为是不一致的。有时脚本会停止,但有时它会继续没有问题。

我在脚本上运行了strace。复制操作结束后,我看到了:

read(255, "\0\0\0\0\0\0\0\0\0\0"..., 5007) = 1302
read(255, "", 5007)       = 0
exit_group(0)             = ?

我知道bash将脚本文件读入内存并从那里执行,但是它有可能在某个时候尝试重新读取脚本文件而失败(因为它不再存在)? tar文件非常大,从脚本开始到复制最后一个文件(从第二张DVD)开始大约需要10-15分钟。

1 个答案:

答案 0 :(得分:3)

我发现你已经找到了一个解决方法,所以我将尝试揭示正在发生的事情:

bash没有将整个脚本读入内存,它正在对其进行缓冲读取,每次只需要尽可能多(可能是与终端输入共享代码)。在启动任何外部命令之前,bash寻找脚本中的确切位置,并在命令完成后继续从那里读取。如果在脚本文件运行时编辑脚本文件,则可以看到此信息:

term1$ cat > test.sh
sleep 8
echo DONE
term1$ bash test.sh

sleep正在执行时,从另一个终端更改脚本:

term2$ cat > test.sh
echo HAHA

观察bash完成后sleep如何混淆:

test.sh: line 2: A: command not found

它记得输入文件中的位置在sleep之前是8,因此它尝试从那里读取并面对覆盖的脚本中的最后一个A

现在你的情况。通常,从DVD打开文件会锁定驱动器并禁止更改磁盘。如果您仍然设法更改磁盘,那肯定会涉及一个umount,这应该使脚本fd无效。根据你的strace输出显然没有发生这种情况,这有点奇怪。在任何情况下,bash都无法读取脚本的其余部分。