我正在创建一个脚本来从文件中读取命令并执行。 它从文件中读取命令并执行它。此外,从文件读取输入并将每个输出的命令输出到文件。
我正在与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选项。
答案 0 :(得分:5)
在此行中,您清除输入文件(显然是故意的):
echo "" > $INPUT_FILE
然后您将空输入文件提供给您的命令:
$cmd < $INPUT_FILE > $OUTPUT_FILE 2>&1
您的测试程序不会检查文件结尾错误,但这肯定是在stdin被重定向到空文件后尝试从stdin读取时会收到的错误。 (由于没有任何内容被读入缓冲区,并且缓冲区永远不会被初始化,因此打印数据的尝试是未定义的行为。因此输出只是空格的事实纯属巧合。)
为什么这个结果令人惊讶?
如果您在同一输入文件中有真实数据,则在读取数据之前不应清空该文件。