如何在Bash中传递输入到输出?优化README命令记录流程
嘿,这问题我熟!咱们一步步来解决:
1. 实现「命令本身 + # + 命令输出」的核心方案
你想要的echo test # test这种格式,关键是要同时拿到命令文本和命令执行后的输出,而不是只传递输出。直接用管道的话,只会把命令的输出传给下一个命令,丢了命令本身。这里有几个实用的方法:
方法一:用变量保存命令,再组合输出
# 定义要执行的命令 cmd="echo test" # 执行命令并保存输出 output=$($cmd) # 拼接命令和输出 echo "$cmd # $output"
执行后直接得到:echo test # test,完美符合你的需求。
方法二:一行式简化写法
如果想少写几行,可以把变量和执行合并:
cmd="echo test"; echo "$cmd # $($cmd)"
效果和上面完全一样。
方法三:封装成函数复用
要是你经常需要做这个操作,写个函数更方便:
print_cmd_with_output() { # 接收传入的命令字符串 local cmd="$*" # 执行命令并捕获输出 local output=$($cmd) # 输出组合结果 echo "$cmd # $output" }
调用的时候直接传命令就行:
print_cmd_with_output "echo test" # 输出:echo test # test print_cmd_with_output "date +%Y-%m-%d" # 输出:date +%Y-%m-%d # 2024-05-20(示例结果)
2. 为什么你之前的命令没达到预期?
你用的echo test | xargs echo '#' | cat <(echo) <(cat -),问题出在:
echo test的输出是test,管道把这个输出传给xargs,所以xargs只拿到了test,根本不知道原命令是echo testxargs echo '#'会变成echo '#' test,输出# test- 后面的
cat <(echo) <(cat -)只是在前面加了个空行,所以最终结果是空行+# test,自然和你想要的不符。
3. Bash中输入到输出的传递(保留命令本身的场景)
通常我们说的输入输出传递是用管道|,但管道只能传递命令的输出内容,如果要保留命令本身,就得像上面那样,先把命令作为字符串保存,再单独执行它获取输出,最后把两者组合起来。
如果是单纯的“传递输出”(不需要保留命令),那就是最基础的管道用法,比如echo test | grep 't',把echo test的输出传给grep处理。
内容的提问来源于stack exchange,提问作者RD Ward
相关产品推荐
相关产品推荐

