![当命令提示用户输入时,如何将命令的输出重定向到文件?](https://linux22.com/image/1447340/%E5%BD%93%E5%91%BD%E4%BB%A4%E6%8F%90%E7%A4%BA%E7%94%A8%E6%88%B7%E8%BE%93%E5%85%A5%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E5%B0%86%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我有一个命令,它会提示用户输入一些内容,然后将结果输出到终端。我输入了下面的命令,将输出重定向到文件:
$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 -p
the_command | tee abc.txt
注释和参考文献:
添加"$@"
你可以传递所有参数脚本的函数。
您可能会对从互联网上的许多来源了解有关 bashredirection 的更多信息感兴趣。
- 根据建议斯科特在他的评论中有一个Unix SE 的 wiki 答案:一个很好的起点。
- 必须
man bash
或bash 手册。 - 我发现重定向章节很有用bash-hackers您可以在其中找到以下链接过时的用途也。
- 您可以参考高级 Bash 脚本指南,第20章也是。
答案2
默认情况下,只有STDOUT
被重定向和/或管道化。您想要的是保持STDOUT
原样,并将通过STDIN
重定向传递的任何内容保留下来。
如果the_command
可以选择编辑,您可以确保问题被输出到STDERR
(无论任何重定向都应该将其转储到屏幕),然后让它通过回显用户输入的内容回到屏幕上STDOUT
。
答案3
通常有 2 个重要的输出管道:(STDOUT
用于常规输出)和STDERR
(用于错误消息)。
这里的问题是,命令的“常规”输出和提示文本都写入STDOUT
,因此它们总是被放入相同的位置。当您使用重定向时,它只会获取整个STDOUT
,包括提示。
如果无法重写该命令(如 Jarmund 在另一个答案中所建议的那样),那么该命令可能有一个附加选项/标志(如--output
),可以指定一些输出文件而不是使用重定向?