bash重定向输出到文件-无法存储临时文本

时间:2019-05-28 14:10:52

标签: php bash ftp

我对此进行了搜索,但没有找到答案。

所以我的问题不是关于Linux Shell中的简单输出重定向。我希望它在正在编写的bash脚本中发生,并且我希望在该脚本中运行的任何脚本或命令的输出和错误都重定向到单独的文件中。

这是我当前正在使用的:

STATUSFILE=x.out
LOGFILE=x.log
exec > ${STATUSFILE} 2>${LOGFILE}
echo "bla bla"
#some other commands

对于正常输出正常工作。但是,例如,在脚本的一部分中,我使用ftp put将其放入备份服务器。当我手动运行时,我会看到一个进度条,上面显示了经过了多少时间以及将花费多少时间。

我想做的是捕获那种似乎正在动态更新的输出,并且有点动态,目前我将其他输出存储在文件中,但是没有那种动态输出。

另一个问题是我是否遵循一种好的方法来做到这一点。正如我说的那样,我希望输出,我将通过另一个进程使用该输出来查看进度,然后使用它来通知用户尝试使用浏览器运行任务。

例如,以我为例,它将一个大文件上传到ftp存储器中,该文件将由用户从浏览器中命令,然后我运行这些脚本,并且希望有一个进度条向用户显示状态。 (我知道如何在客户端处理它-可能是套接字连接或间隔ajax请求检查文件或服务器触发的事件)

我的第二个问题是如何获得具有动态输出的命令的进度。

如果不清楚,请通知我,我将尝试修复它。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

早上好

  

所以我的问题不是关于Linux Shell中的简单输出重定向。我希望它发生在我正在编写的bash脚本中

那很简单。您只需要将命令括在{}中即可。

#!/bin/bash

{

  echo "hello world!"
  ls -la 

} >> script.log
  

我希望将在该脚本中运行的任何脚本或命令的输出和错误重定向到单独的文件中。

如果相同输出应放在单独的文件中,则可以使用tee

#!/bin/bash

{

  echo "hello world!"
  ls -la 

} | tee foo bar baz

如果不同命令的输出应放在不同文件中,则只需使用不同的{}块。

  

我的第二个问题是如何获得具有动态输出的命令的进度。

某些工具倾向于将进度条放到STDERR。您可以使用2>&1将STDOUT和STDERR重定向到同一文件。 2是STDERR的描述符,1是STDOUT的描述符,基本上是在1上附加2。

因此,您将第一个脚本重写为:

#!/bin/bash

{

  echo "hello world!"
  ls -la 

} >> script.log 2>&1
不过,

要小心。一些工具使用颜色和回车键来显示如此精美的进度条。在日志文件中,这看起来很难看。