Bash-Shell 脚本中止没有错误

Posted

技术标签:

【中文标题】Bash-Shell 脚本中止没有错误【英文标题】:Bash-Shell Script aborts without error 【发布时间】:2014-01-08 15:08:50 【问题描述】:

在 Debian 上,以下代码可以运行,但在 CentOS 上它只是中止而没有任何错误。错误是什么?看不懂。

    echo "Test 1"
    ANSWER=""
    read -p "Enter y or n " ANSWER;
    echo "Test 2"

输出看起来总是这样:

    Test 1

我也尝试了不带参数-p的读取命令,但这也不起作用:

    echo "Test 1"
    ANSWER=""
    echo "Enter y or n "
    read ANSWER;
    echo "Test 2"

输出:

    Test 1
    Enter y or n

如果我在命令行执行命令,它是否工作,它应该如何工作。该脚本具有以下“标题”:#!/bin/bash

有人可以帮忙吗?

【问题讨论】:

type read 的输出是什么? @anubhava "read is a shell builtin" - 在两个系统上 它是中止回你的shell,还是在等待输入?这可能是一个缓冲问题。 您使用哪个 shell 来执行脚本?将 hashbang 放在开头以确保您使用的是 bash #!/bin/bash @Donovan 它中止返回我的外壳。它不等待任何输入。 【参考方案1】:

@user2966991 - 从标准输入读取的脚本位于更大的 while 循环中,该循环通过标准输入读取文件。这行不通。尝试将您的标准输入重定向到不同的文件处理程序。

考虑这个示例代码。这不起作用,因为 while 循环和读取都是从标准输入读取的。

#!/bin/bash
cat samplefile | while read line; do
    read -p "$line (y/n)?" ANSWER
done

现在考虑这个其他代码。

#!/bin/bash
# save stdin to file descriptor 5
exec 5<&0

cat samplefile | while read line; do
    read -p "$line (y/n)?" ANSWER <&5
done

# restore stdin and close file descriptor 5
exec 0<&5 5>&-

我个人更喜欢输入重定向而不是管道。

cat file | while read var; do
...
done

可以写成

while read var; do
...
done < file

下次请在此处发布您的脚本,否则您将得不到任何答复。

【讨论】:

@user3088572 太棒了!非常感谢!但我对你的解决方案有两个问题。 1. 描述符是否类似于 C++ 中指向存储地址的指针?如果我告诉我正确,我也可以使用描述符 3 到 9 还是? 2. 为什么你更喜欢输入重定向而不是管道?是否有任何性能提升? 是的,它是一个指向文件的指针。描述符 0 是标准输入,1 是标准输出,2 是标准错误。您绝对可以使用 3 到 9。通过使用输入重定向,我可以避免运行额外的进程,这些进程对缓慢而重负载的服务器是有害的。在健康的系统上,您不会注意到差异。 @user3088572 啊,好的。非常感谢您提供这些信息! :)【参考方案2】:

试试这个

#!/bin/bash

echo "Test 1"
read -p "Enter y/n: " ANSWER
echo " Test 2: $ANSWER"

你不需要在回答结束时结束。

【讨论】:

它像小脚本一样工作,但在我的大脚本中却不行。在脚本的第二行写着“set -e”。如果我对此发表评论,它不会中止,但它也不会显示带有输入的消息。代码如下所示: ANSWER="" while [[ "$ANSWER" == "" ]]; do read -p "Enter y/n:" ANSWER fi @user2966991 - 如果它作为我期望的小脚本工作,那么问题不在此代码块中。你有没有检查过它是否在大脚本中填满了输入缓冲区,并以某种方式流入了这个块? 此外,set -e 用于调试目的,因此脚本将在出错时退出。脚本遇到错误情况,这就是为什么在设置“set -e”时它会中止。 @user2966991 这是正确的,你需要去# 注释掉你的代码部分,看看问题到底在哪里。 @user3088572 啊,好的。感谢您的提示!

以上是关于Bash-Shell 脚本中止没有错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有错误消息的情况下中止makefile

DatabaseError:当前事务被中止,命令被忽略直到事务块结束 - 在隐身模式但正常没有错误

确保脚本在用户中止时退出

快照隔离事务由于更新冲突而中止,但没有事务开始

Google Adword 脚本中止并出现以下错误:传递给回调函数的返回值必须是字符串

Heroku - ClearDB:连接中止 - 对等方重置连接