linux - Bash 脚本退出且没有错误

标签 linux bash shell tar strace

我有一个从 DVD 运行的 bash 脚本。此脚本将多卷 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 分钟。

最佳答案

我看到您已经找到了解决方法,所以我将尝试揭示发生了什么:

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

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

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

term2$ cat > test.sh
echo HAHA

观察 bashsleep 完成时如何变得困惑:

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

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

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

关于linux - Bash 脚本退出且没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17107208/

相关文章:

Bash 脚本检查 cmd 的输出是否在一段时间内增加,如果是则运行

linux - 当使用 Linux NIS(网络信息服务)管理用户时,如何使用当前主机用户运行 docker

linux - 我可以在没有预先存在的源文件的情况下创建包吗?

linux - 用冒号分隔子列表

linux - 比较命令 bash 的数值输出

bash - build.xml 文件中的 cd 命令

bash - shell脚本用户管理程序

bash - 将值从子 shell 脚本返回到父脚本

linux - 在 Linux 中向群组发送消息

linux - 目标是从显示信息中提取视频驱动程序版本,然后将其与支持的版本列表进行比较