![Shell 命令输出到文件并执行命令](https://linux22.com/image/159091/Shell%20%E5%91%BD%E4%BB%A4%E8%BE%93%E5%87%BA%E5%88%B0%E6%96%87%E4%BB%B6%E5%B9%B6%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4.png)
除了将命令输出到文件之外,如何输出命令本身?
我知道我能做到如何在 shell 脚本中将文本输出到屏幕和文件?捕获输出。我的用例特定于 pytest。
pytest /awesome_tests -k test_quick_tests -n auto &> test_output_$(date -u +"%FT%H%MZ").txt
在输出中执行命令确实很有帮助,这样我就可以明确知道结果的用途。
答案1
另一种选择是,仅使用 bash 进行&>
您开始时的重定向,但否则与 sh 兼容:
set -- '/awesome_tests' '-k' 'test_quick_tests' '-n' 'auto'
{ printf '%s %s\n' 'pytest' "$*";
pytest "$@";
} &> test_output_$(date -u +"%FT%H%MZ").txt
这将设置位置参数以包含命令的参数pytest
;然后它在大括号分组内运行两个命令{}
:
- 打印
pytest
字符串,后跟由空格连接的参数( 的默认第一个字符$IFS
) pytest
使用给定参数运行实际命令
然后该大括号组将像以前一样重定向。
答案2
sh -v <<< 'pytest /awesome_tests -k test_quick_tests -n auto' \
&> test_output_$(date -u +"%FT%H%MZ").txt
sh -v
导致sh
将每个命令行回显到stderr
,因此由于您已经捕获stderr
到输出文件,因此所需要做的就是使用该-v
选项并提供sh
您希望运行的命令。
请注意,在我的测试中,sh -v -c 'your-command-here'
没有起作用。
echo 'pytest /awesome_tests -k test_quick_tests -n auto' | \
sh -v &> test_output_$(date -u +"%FT%H%MZ").txt
确实有效,但这echo ... |
就是bash
的<<<
用途。