【问题标题】:Bash-Shell Script aborts without errorBash-Shell 脚本中止没有错误
【发布时间】: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 它中止返回我的外壳。它不等待任何输入。

标签: linux bash shell centos6


【解决方案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 啊,好的。感谢您的提示!
猜你喜欢
  • 2017-07-25
  • 1970-01-01
  • 2019-08-11
  • 2018-08-11
  • 1970-01-01
  • 2010-11-05
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多