管道或复合命令如何与 `:` 和 `echo` 一起使用?

管道或复合命令如何与 `:` 和 `echo` 一起使用?
: [arguments] 

除了扩展参数和执行重定向之外,不执行任何操作。

管道或复合命令如何与 一起使用:

大括号似乎并不能解决问题:

$ : { echo hello | cat; }
bash: syntax error near unexpected token `}'
    
$ : { if test 1; then echo hello; fi; }
bash: syntax error near unexpected token `then'

双引号会阻止一些扩展,这:允许。

echo使用代替时也会出现同样的问题:

$ echo { echo hello | cat; }
bash: syntax error near unexpected token `}'
$ echo { if test 1; then echo hello; fi; }
bash: syntax error near unexpected token `then'

基本上我想运行一个命令来扩展和重定向:,并使用检查结果echo。引用没有提到管道和控制流关键字不起作用,所以我只希望别名扩展不会发生。

谢谢。

答案1

: { echo hello | cat; }

shell 解析该命令行。首先,它尝试找到第一个命令的结尾。那一端就是管道。

所以第一个命令是

: { echo hello

它什么也不做。特别是它没有向 cat 传输任何内容。和

: { echo hello | cat;

消失后只剩下左边,}这不是一个有效的命令。

答案2

:是一个命令,因此它可以像其他命令一样在管道中使用:

something | :
: | something
something | : | something-else

...但是它不会对您有任何好处,因为该:命令不执行任何操作:它不接受输入并且不产生输出。因此,这些管道都不是非常有用的管道(除了我认为第二个管道是稍微短一点的管道something </dev/null)。

至于您的示例命令:

$ : { echo hello | cat; }

这看起来像是一个语法错误,就像 shell 报告的那样。该{ ... }构造可以使用代替一个简单的命令,但不以某种方式...与它结合(?)。您到底希望这个复合命令做什么?也许您需要添加更多关于您想要实现的目标的细节。

相关内容