如何自动将终端命令输出保存到文件

如何自动将终端命令输出保存到文件

有没有办法将终端命令输出保存到文件中,而不必每次都写入命令'| tee /abc.txt'?

答案1

一种选择是使用该script程序

NAME
     script — make typescript of terminal session

SYNOPSIS
     script [-a] [-c command] [-e] [-f] [-q] [-t[=file]] [-V] [-h] [file]

DESCRIPTION
     script makes a typescript of everything printed on your terminal.  It is
     useful for students who need a hardcopy record of an interactive session
     as proof of an assignment, as the typescript file can be printed out
     later with lpr(1).

但请注意,这可以script节省一切在终端中(而不仅仅是命令输出) - 包括 ANSI 颜色序列,这会使在彩色终端的情况下从结果文件中提取纯文本变得困难。


免责声明:

以下只是一个想法,使用时可能会出现一些我不知道的陷阱

类似于@MomentumMori 建议的生成tee-d bash 子 shell,如果你想要使用重定向,你可以这样做

exec 3>&1

保存当前标准输出文件描述符,然后

exec 1> >(tee -a outfile)

从此时起,标准输出被重定向到tee过程将所有内容附加到outfile。由于我们尚未重定向子进程的输出流,因此命令输出的副本仍会出现在终端中。

完成要捕获其输出的命令后,您可以反转重定向并关闭临时文件描述符

exec 1>&3 3>&-

之后你可以查看outfile命令的输出

cat outfile

答案2

是的。

在您的终端上使用tee

$ bash | tee /abc.txt

解释

  • bash将在当前使用的 shell 中启动另一个 shell。看起来好像什么都没发生,但是,如果您尝试关闭终端,系统会提示您类似以下内容:

    There is still a process running in this terminal. Closing the terminal will kill it.

    那个进程就是bash。它会像读取其他 shell 一样读取你的命令,没有任何问题,因为你的第一个 shell 很可能bash也正在运行。这只是一个例子。还有其他 shell,你可以在这里找到它们:[审阅者,在此处插入链接 1]

    完成后,您可能想要键入内容exit来关闭它。

  • |是用来表示管道的字符。M. Jackson 在这里解释了它们的含义:http://www.dsj.net/compedge/shellbasics1.html

    管道。UNIX 哲学提倡使用小型但高度集中的程序,这些程序可以一起使用来执行复杂的任务。因此,学习如何在命令行上将多个小命令串联在一起是熟悉 Bash 的内在部分。为此,我们将一个程序的标准输出定向到另一个程序的标准输入中,但我们不使用重定向器,而是使用管道运算符“|”。在 UNIX 中,通过管道连接的进程随着数据在它们之间流动而动态地一起运行。

  • 并且tee,为了完整起见:[审阅者,在此处插入链接 2]

    [读取] 从标准输入并写入标准输出和文件

这意味着 的输出bash(更准确地说是其中运行的命令的输出)将作为tee其输入。这样就无需| tee /abc.txt在每个命令之后使用 来在 shell 上查看其输出并将其保存在文件系统中。

答案3

不。

这与称为“标准输入”和“标准输出”的套接字的工作方式有关,也与 Unix/Linux 工具链的总体理念“只做一件事,做好它”有关。你可能需要花一两分钟来理解http://www.tldp.org/LDP/abs/html/io-redirection.html “Bash 中的 IO 重定向”

综上所述,您可以编写一个脚本来使用该重定向包装命令,但它仍然不能为您节省很多击键次数。

相关内容