10 管道符 - eLecCap1taL/CS2-CFG-Wiki GitHub Wiki

什么是管道符

有过计算机相关经验的读者肯定对管道符并不陌生,是的,CS2 的控制台也支持管道符 |

键盘怎么打出这个字符?😥

一般在回车键的上方,和反斜杠 \ 一起,你需要按住 shift 才能打出它

简单来说,它可以把左侧的输出传递给右侧的指令,作为输入。

这里的 “输出” 指的是输出到控制台的内容,例如 echo。一个相反的例子是 say,它的这种 “输出” 并不能被控制台捕获

一般来说,执行一条指令,如果你能在控制台内看到 “输出”,就能被管道符捕获

有些时候,控制台出现的文本并不是这个指令 “输出” 的,而是它执行了其他指令,其他指令产生了输出,这种输出不能被捕获

包括穿过 自定义alias 和 exec 的内容,都不能被捕获

只有直接输出内容的能被捕获

尝试如下例子:

echo 1 //输出 1

echo 1 | echo //左侧指令输出 1,传递给右边作为参数,输出 1

exec jiting //加载 jiting.cfg

echo jiting | exec //左侧指令输出 jiting,传递给右边作为参数,加载 jiting.cfg
//现在你应该也能理解这个写法

echo 你好 | say //左侧指令输出 你好,传递给右边,在聊天中说出了 你好

管道符在传递时会自动加上空格

管道符非常重要,是很多高级应用的基础,务必理解它的作用

与一般终端的管道符的不同之处

事实上,CS2 的管道符行为和一般终端的管道符行为并不完全一致。

对于正常的终端,考虑如下指令:

A | B | C | D

它的执行顺序应该是:

  • A 执行,产生输出,传递给 B 作为参数
  • B 执行,产生输出,传递给 C 作为参数
  • C 执行,产生输出,传递给 D 作为参数
  • D 执行,产生输出,输出到控制台

因此考虑如下的指令组合(我们暂且不考虑终端中 echo 忽略标准输入的特性):

echo 1 | echo 2 | echo 3 | echo 4

它理应是:

  • echo 1 执行,产生输出 1,传递给 echo 2 作为参数
  • echo 2 1 执行,产生输出 2 1,传递给 echo 3 作为参数
  • echo 3 2 1 执行,产生输出 3 2 1,传递给 echo 4 作为参数
  • echo 4 3 2 1 执行,产生输出 4 3 2 1,输出到控制台

事实上,CS2 会输出……💀

4 1 2 3

因此请不要直接把 CS2 的管道符当做一般 Unix/Linux 系统终端的管道符,CS2 的指令解析还没有那么强大。

这里给出一套理解 CS2 管道符的方式:

输出1 | 输出2 | 输出3 | ... | 输入

只有最后一个指令会接收到来自管道符的输入,前面所有的指令都只是输出,且它们的输出会按照从左往右的顺序传递给输入指令

例如:

echo 2 | echo 3 | echo 1 | say 0

对于 CS2 的管道符,正确的理解方式是:前三个指令都是输出,他们分别输出 2 3 1,按顺序传递给最后的指令 say 0,因此整个指令相当于 say 0 2 3 1

管道符非常重要,后面还会用到多次 🤔