如何将输出/错误打印到文本文件?

时间:2014-03-26 18:48:33

标签: linux bash shell

我试图将标准错误/输出重定向(?)到文本文件。 我做了我的研究,但由于某种原因,在线答案对我不起作用。 我做错了什么?

cd /home/user1/lists/

for dir in $(ls)
do
(
echo | $dir > /root/user1/$dir" "log.txt
) > /root/Desktop/Logs/Update.log
done

我也试过

2> /root/Desktop/Logs/Update.log
1> /root/Desktop/Logs/Update.log
&> /root/Desktop/Logs/Update.log

这些都不适合我:(

请帮忙!

2 个答案:

答案 0 :(得分:1)

尝试以下基础知识:

echo hello >> log.txt 2>&1

可以读作:回显单词hello,重定向并将STDOUT附加到文件log.txt。 STDERR(文件描述符2)被重定向到指向STDOUT的任何地方。请注意,STDOUT是默认值,因此“>>”前面没有“1”。仅适用于当前行。

要重定向并附加脚本中所有命令的所有输出和错误,请将此行放在顶部附近。它将对脚本的长度有效,而不是在每一行上执行:

exec >>log.txt 2>&1

答案 1 :(得分:0)

如果您尝试获取/home/user1/lists中的文件列表,则根本不需要循环:

ls /home/usr1/lists/ >Update.log

如果您尝试将目录中的每个文件作为可执行文件运行并以换行符作为输入,并在Update.log中收集所有这些程序的输出,请尝试以下操作:

for file in /home/user1/lists/*; do
    echo | "$file"
done >Update.log

(注意我们如何避免useless use of ls以及循环内部没有重定向。)

如果要为目录中的每个文件创建一个名为*.log.txt的空文件,您可以

for file in /home/user1/lists/*; do
    touch "$(basename "$file")"log.txt
done

(使用basename获取没有目录部分的文件名可以避免使用cd但是你可以反过来做。通常,我们倾向于避免在脚本中更改目录,以便该工具可以从任何地方运行,并在当前目录中生成输出。)

如果要创建包含单个换行符的文件,无论它是否已存在,

for file in /home/user1/lists/*; do
    echo >"$(basename "$file")"log.txt
done

在原始程序中,您将echo重定向到循环内部,这意味着done之后的重定向根本不会收到任何输出,因此创建的文件将为空。

这些对你实际上想要完成的事情有点猜测,但应该有助于在正确的方向上轻微推动你。 (我认为这应该是一个评论,但它太长而复杂。)