重定向到文件,包括当前提示行

重定向到文件,包括当前提示行

如何将重定向的命令本身包含到输出文件重定向中?例如

echo "hello!">output.txt

我想要输出文件的内容如下:

echo "hello!">output.txt
hello!

答案1

您可能需要这里的两件事之一。

  1. 使用teeecho获取发送到终端以及文件的结果:

    $ echo 'hello!' | tee output
    hello!
    $ cat output
    hello!
    
  2. 用于script捕获整个终端会话:

    $ script
    Script started, output file is typescript
    $ echo 'hello!' >output
    $ cat output
    hello!
    $ exit
    Script done, output file is typescript
    
    $ cat typescript
    Script started on Sat Nov 10 15:15:06 2018
    $ echo 'hello!' >output
    $ cat output
    hello!
    $ exit
    
    Script done on Sat Nov 10 15:15:37 2018
    

如果这不是您所要求的,请澄清您的问题。

答案2

就您所要求的一般性而言,这是不可能的。

要使用其他工具(类似于script(1))实现此目的,该程序有必要观察您的 shell,

command >foo

foo是文件名,然后创建它。另外,shell 会尝试创建它,因此已经存在冲突。另外,如果程序打印怎么办?

command >foo

到航站楼?

从 shell 内部来看,从编程的角度来看,shell 的重定向过程是极其原始的(尝试找到一个他们自己构建原始 shell 的 C 讲座,这真的很令人惊讶)。

如果您确实需要此功能,则必须破解自己的 shell 来拦截重定向并将命令传递到目标文件中。但细节上可能存在很多令人讨厌的问题......

答案3

您还可以通过管道传输整个外壳:

$ sh -i |& tee sh.log
sh-4.4$ hello
sh: hello: command not found
sh-4.4$ echo hi
hi
sh-4.4$ exit

-i尽管 stdout 不是终端,但仍需要保持 shell 的交互性。 bash 和 zsh 也支持该选项。|&管道标准输出和标准错误;它适用于 zsh 和 bash,但不适用于 sh(在那里,你需要2>&1 |)。当然,如果您只想重定向到文件而仅此而已,您也可以使用&>or 。2>&1 >无论如何,sh.log这里包含了一切。

$ cat sh.log
sh-4.4$ hello
sh: hello: command not found
sh-4.4$ echo hi
hi
sh-4.4$ exit

答案4

如果您可以接受删除输出文件名,我认为以下是最简单的方法:

command='echo "hello!"'
(echo "$command"; eval "$command") >output.txt

但如果您需要打印文件名,那么您可以使用以下命令:

command='echo "hello!"'
(echo "$command >output.txt"; eval "$command") >output.txt

您可以为文件名引入一个变量,以确保两次出现的文件名相同:

output="output.txt"
command='echo "hello!"'
(echo "$command >$output"; eval "$command") >$output

这样您就可以避免打印文件名与实际文件名不同的风险。

相关内容