Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash脚本无错误退出_Linux_Bash_Shell_Tar_Strace - Fatal编程技术网

Linux Bash脚本无错误退出

Linux Bash脚本无错误退出,linux,bash,shell,tar,strace,Linux,Bash,Shell,Tar,Strace,我有一个bash脚本,我正在从DVD运行。此脚本将多卷tar文件从DVD复制到本地计算机。在复制过程中,脚本会提示用户插入第二张DVD,此时将复制其余文件。脚本存在于第一张DVD上,但不存在于第二张DVD上 在复制最后一个文件之后,但在开始tar多卷提取操作和后续处理之前,此脚本只是停止。没有报告任何错误或消息。我试着用“-x”运行bash,但没有任何可疑之处,甚至没有退出声明。更不幸的是,这种行为前后不一致。有时脚本会停止,但有时它会继续运行,不会出现任何问题 我已经对剧本进行了详细分析。在复

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

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

我已经对剧本进行了详细分析。在复制操作结束后,我看到:

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
在执行
睡眠时,从另一个终端更改脚本:

term2$ cat > test.sh
echo HAHA
观察
睡眠完成后
bash
是如何变得混乱的:

test.sh: line 2: A: command not found
它记得输入文件中的位置在
睡眠
之前是8,因此它尝试从那里读取,并遇到被覆盖脚本中的最后一个
A


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

dmesg中是否有任何内容表明您的内存不足或类似情况?我倾向于尝试修改脚本,将其自身复制到本地存储,然后从那里执行。谢谢您的建议。我去查一下dmesg。我实际上考虑过将脚本复制到/tmp,然后从那里重新调用它。我唯一担心的是,父脚本仍然是从DVD执行的。在子脚本退出之前,bash可能不会尝试重新读取父脚本(此时我已经完成了),我只是能够复制它。dmesg中没有任何内容。有趣的是,我在运行“cat/dev/zero>/dev/shm/file”并在vi中打开一个非常大的日志文件时复制了它,以尽可能多地使用内存(我得到了32M的空闲空间!)。我不确定是这些原因造成的,还是我很幸运,但这是值得注意的。我将修改脚本,将其自身复制到/tmp,然后从那里重新运行它。然后,我会重新测试。我们看看会发生什么。我认为你完全正确。我能找到的所有证据都支持这一点。到目前为止,我的变通方法似乎正在发挥作用。谢谢不过,我要说的是,bash没有报告任何类型的错误,这很奇怪。你可能会认为他们可以打印一条读失败的消息。是的,但你的扫描显示它没有失败!这是奇怪的部分。。。它只是返回了一堆零,bash随后忽略了这些零,并命中了EOF。