Bash脚本退出没有错误

我有一个bash脚本,我从DVD上运行。 此脚本将DVD中的多卷tar文件复制到本地计算机。 在复制的部分path中,脚本提示用户插入第二张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分钟。

我看到你已经找到了一个解决方法,所以我只是试图发现发生了什么事情:

bash并不是将整个脚本读入内存,而是每次都做必要的缓冲读取(大概是用于与终端输入共享的代码)。 在任何外部命令启动之前, bash查找脚本中的确切位置,并在命令完成后继续从那里读取。 如果您在脚本文件运行时编辑脚本文件,您可以看到这一点:

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

sleep执行期间,从另一个终端更改脚本:

 term2$ cat > test.sh echo HAHA 

观察当sleep完成时bash如何变得困惑:

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

它记得在sleep之前输入文件中的位置是8,因此它试图从那里读取,并且与被覆盖的脚本中的最后A冲突。

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