:关于它在管道中的使用,其语义是什么?
Bash文档指出:
: [arguments]
没有效果; 该命令除了扩展参数和执行任何指定的重定向之外不执行任何操作。返回状态为零。
:然而,在管道中使用时我应该期望什么行为并不明显。它只是简单地通过吗std{in,out,err}?
看来,参数:可以替代任何其他命令。但我需要澄清一下在管道中的使用;澄清不仅基于观察,而且引用了权威来源。
我遇到一种情况,根据脚本运行的环境,我需要运行输出以tr -d '\r'从输出中删除回车符。
唉,目前这意味着一个if/else/fi块,类似于(在函数内部):
if [[ "$OSTYPE" == "cygwin" ]]; then
my_commands | tr -d '\r' || return $?
else
my_commands || return $?
fi
Run Code Online (Sandbox Code Playgroud)
其中 the是 the和Branch| tr -d '\r'之间的唯一区别。当然,任一分支的内容都比此处显示的要复杂得多。ifelse
现在,我知道tr -d '\r'在没有回车的情况下这是良性的。但这是一个调用和(在 Windows 上)可以避免的开销(该函数是“热”代码路径)。所以我想到tr用内置的shell函数来替换:。
Ste*_*itt 14
在这种情况下,传递替换是cat,它将其输入复制到其输出。:不执行任何操作,因此您的输入将丢失:
$ echo hello | :\n$\nRun Code Online (Sandbox Code Playgroud)\n事实上,由于:\xe2\x80\x99t 不读取其输入,输入管道的命令将收到一个SIGPIPE,因此它们可能无法完成任务,甚至无法启动它:
$ (seq 1 10000 | tee /dev/stderr; echo $? 1>&2) | :\n141\nRun Code Online (Sandbox Code Playgroud)\n使用cat意味着外部调用,就像tr(但工作量稍少)。Bash 没有\xe2\x80\x99t 有这种类型的直通内置。