如何将重定向的命令本身包含到输出文件重定向中?例如
echo "hello!">output.txt
我想要输出文件的内容如下:
echo "hello!">output.txt
hello!
答案1
您可能需要这里的两件事之一。
使用
tee
echo
获取发送到终端以及文件的结果:$ echo 'hello!' | tee output hello! $ cat output hello!
用于
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
这样您就可以避免打印文件名与实际文件名不同的风险。