当命令提示用户输入时,如何将命令的输出重定向到文件?

当命令提示用户输入时,如何将命令的输出重定向到文件?

我有一个命令,它会提示用户输入一些内容,然后将结果输出到终端。我输入了下面的命令,将输出重定向到文件:

$the_command > abc.txt

但是不起作用。问题是没有提示,那些提示问题的文本输出到abc.txt而不是我想要的结果。

答案1

您的命令有效,并正确地将输出重定向到文件abc.txt
问题是你的脚本如何询问输入数据你是如何运行脚本的?
让我们通过两个例子来看一下:

# Script_1.sh                                     # 1
echo Please, enter your firstname and lastname    # 2
read FN LN                                        # 3
echo "Hi! $LN, $FN !"                             # 4

# Script_2.sh                                     # 5
read -p "Enter a comment " CM                     # 6
echo  "You said $CM"                              # 7

如果您运行,/bin/bash Script1.sh > abc.txt您将不会在 tty 上看到问题“请输入...”。如果您从键盘输入预期的输入,您将在文件中找到第 2 行和第 4 行的输出abc.txt

如果你运行,/bin/bash Script2.sh > abc.txt你会看到“输入注释”的问题,但是你会发现文件中abc.txt只有第 7 行的输出。

注意:如果你在子 shell 中运行 Script2,sh

(bash Script2.sh 2>&1)> abc.txt

您将不会在 tty 上看到任何输出,您将在abc.txt文件中找到所有内容。
如果您使用

bash Script2.sh 2>ccc.txt 1>ddd.txt`

您将在中找到标准输出(行#7)ddd.txt和标准错误(行#6)ccc.txt


如果你想仅重定向部分命令输出您必须修改脚本。
其中一种方法是创建一个函数,在其中移动将生成有趣输出的脚本部分(见下文)。然后您可以从主要部分您的脚本(它最初是您移入函数的代码)仅将该输出重定向到日志文件:

 Part_To_Redirect(){
     : # all that you want
 }

 # ... Main part of the script
 # point where it was the part that generates the output
 Part_to_Redirect "$@" > abc.txt   # this to store only that part in the file
 # Part_to_Redirect "$@" >> abc.txt  # this to append that part in the file
 # ...

你甚至会发现有用的tee

将输出重定向到多个文件,将标准输入复制到标准输出以及作为参数给出的任何文件。

 the_command  | tee abc.txt       # To redirect Standard output
 or 
 the_command 2>&1 | tee abc.txt   # To redirect err in out and both in the file

在这种情况下,您将在 tty 上获得命令的正常输出,但同时您将在日志文件中保存一份副本。如果您使用script2 中的调用,abc.txt那么在您的情况下应该会很方便。read -pthe_command | tee abc.txt

注释和参考文献:

添加"$@"你可以传递所有参数脚本的函数。

您可能会对从互联网上的许多来源了解有关 bashredirection 的更多信息感兴趣。

答案2

默认情况下,只有STDOUT被重定向和/或管道化。您想要的是保持STDOUT原样,并将通过STDIN重定向传递的任何内容保留下来。

如果the_command可以选择编辑,您可以确保问题被输出到STDERR(无论任何重定向都应该将其转储到屏幕),然后让它通过回显用户输入的内容回到屏幕上STDOUT

答案3

通常有 2 个重要的输出管道:(STDOUT用于常规输出)和STDERR(用于错误消息)。

这里的问题是,命令的“常规”输出和提示文本都写入STDOUT,因此它们总是被放入相同的位置。当您使用重定向时,它只会获取整个STDOUT,包括提示。

如果无法重写该命令(如 Jarmund 在另一个答案中所建议的那样),那么该命令可能有一个附加选项/标志(如--output),可以指定一些输出文件而不是使用重定向?

相关内容