在bash中重定向stdin不能正常处理文件?

时间:2016-07-20 03:27:54

标签: bash

我正在创建一个脚本来从文件中读取命令并执行。 它从文件中读取命令并执行它。此外,从文件读取输入并将每个输出的命令输出到文件。

我正在与ComputerCraft(一个使用lua的Minecraft mod)进行交流。

我用谷歌搜索,并不难找到如何重定向标准输入。 它似乎与/ dev / stdin类似,但不是普通文件。

我测试了cat,nano和bash,但没有一个尝试读取用户输入。 我还测试了这个简单的C程序:

#include <stdio.h>

int main()
{
   char str1[20], str2[30];

   printf("Enter name: ");
   scanf("%s", str1);

   printf("Enter your website name: ");
   scanf("%s", str2);

   printf("Entered Name: %s\n", str1);
   printf("Entered Website:%s", str2);

   return(0);
}

当我使用脚本运行此程序时,我得到了这个:

  

输入姓名:输入您的网站名称:输入姓名:

     

进入网站:

正常情况下,这应该是这样的:

  

输入姓名:Gippeumi

     

输入您的网站名称:omg

     

输入姓名:Gippeumi

     

进入网站:omg

有没有办法让这项工作?

编辑:我忘了上传剧本了。这是它:

#!/bin/bash
echo "Loading..."
BASE_DIR="mem/"
STATUS_FILE=$BASE_DIR"Status"
OUTPUT_FILE=$BASE_DIR"Output"
INPUT_FILE=$BASE_DIR"Input"
RETCODE_FILE=$BASE_DIR"ReturnedCode"
CMDIN_FILE=$BASE_DIR"CommandInput"

READY=0
RUNNING=1

sudo umount mem
sudo mount -t tmpfs tmpfs mem
rm -rf $INPUT_FILE
echo $READY > $STATUS_FILE
touch $OUTPUT_FILE
touch $INPUT_FILE
touch $RETCODE_FILE
touch $CMDIN_FILE
echo "Ready for command inputs."
while true; do
    cmd=`cat $CMDIN_FILE`
    if [ ! -z "$cmd" ]; then
        echo "Running: "$cmd
        #Clear inputs first
        echo "" > $CMDIN_FILE
        echo "" > $INPUT_FILE
        echo $RUNNING > $STATUS_FILE
        $cmd < $INPUT_FILE > $OUTPUT_FILE 2>&1
        echo $? > $RETCODE_FILE
        echo $READY > $STATUS_FILE
    fi
done

我可以这样使用:

echo "ls" > mem/CommandInput #Enter command
cat mem/Output #See output

我制作了另一个脚本来轻松测试命令。

echo "Loading..."
BASE_DIR="mem/"
STATUS_FILE=$BASE_DIR"Status"
OUTPUT_FILE=$BASE_DIR"Output"
INPUT_FILE=$BASE_DIR"Input"
RETCODE_FILE=$BASE_DIR"ReturnedCode"
CMDIN_FILE=$BASE_DIR"CommandInput"

READY=0
RUNNING=1

echo "Ready for user inputs."
while true; do
    printf "> "
    read cmd
    echo $cmd > $CMDIN_FILE
    while [ `cat $STATUS_FILE` -eq 0 ]; do
        echo "Dummy" > /dev/null
    done
    while [ `cat $STATUS_FILE` -eq 1 ]; do
        echo "Dummy" > /dev/null
    done
    cat $OUTPUT_FILE
    echo "Return code: " `cat $RETCODE_FILE`
done

注意:我没有写入文件。但是我认为即使我没有写任何文件也应该做点什么。我想要的是首先启动程序,然后再写。 也许EOF引起了问题?

这就是我启动C程序时发生的事情。

当我启动此脚本时,它看起来像这样:

Loading...
Ready for user inputs.
> 

我键入./inputTest这是C程序。

> ./inputTest
Enter name: Enter your website name: Entered Name: 
Entered Website:Return code:  0
> 

请注意我刚输入命令。我无法尝试输入任何内容,因为它不允许我输入任何内容。

在apt-get中,它从未问过我任何事情。如果我在该提示符下运行“sudo apt-get remove”,它只是删除包而不询问。我没有使用-y选项。

1 个答案:

答案 0 :(得分:5)

在此行中,您清除输入文件(显然是故意的):

echo "" > $INPUT_FILE

然后您将空输入文件提供给您的命令:

$cmd < $INPUT_FILE > $OUTPUT_FILE 2>&1

您的测试程序不会检查文件结尾错误,但这肯定是在stdin被重定向到空文件后尝试从stdin读取时会收到的错误。 (由于没有任何内容被读入缓冲区,并且缓冲区永远不会被初始化,因此打印数据的尝试是未定义的行为。因此输出只是空格的事实纯属巧合。)

为什么这个结果令人惊讶?

如果您在同一输入文件中有真实数据,则在读取数据之前不应清空该文件。