关于 Linux,我首先注意到的是向命令中输入数据的不同方式,我知道一些,但我不知道总共有多少种。
目前我所知道的方式:
管道:
echo -e "zorro\nwurst\nlahmacun\nsozialhilfe" | sort
从带有文件结束信号的键盘:
sort
>gurken
>zucker
>braunkohle
从文件:
sort foo
HERE 字符串(实际上称为 HERE 文档):
sort << HERE
>wasserkopf
>elternzeit
>schuldeingeständnis
>währungsreform
>alabasterhaut
HERE
这是全部还是有更多方法可以做到这一点,为什么有不同的方法,有些方法是多余的吗?
答案1
首先,sort << HERE
等等不是此处的字符串。这是一个此处文档。这里的字符串使用<<<
运算符。这是在 bash (和其他一些 shell)中。
一般来说,有两种方法。一种是通过标准输入(和重定向),另一种是通过参数。
标准输入及其重定向
这是默认连接到终端的流,在其中执行命令并与 fd(文件描述符)1 关联。向终端输入的任何内容都会被输入。尽管它(输入)可以像使用管道
|
或使用此处文档或此处字符串一样进行重定向。那么输入不是来自终端,而是附加到管道之前的命令的标准输出。不同的 shell 有不同的重定向,因此对于此类别,您应该检查 shell 文档。寻找输入重定向。参数
这就是您的示例中的内容
sort foo
。调用程序或函数时,您向其传递一个或多个参数。本地文件只是一种可能性。该参数可能包含 URL 或其他内容。这里的选择是无穷无尽的。
总结起来,一般有两种方式:
第一个从应用程序的内部逻辑中抽象出来并在操作系统/shell 级别上操作标准输入,
而第二个则涉及应用程序的内部结构,正是它们基于调用参数作为接口提供了无限的可能性。
对于这两种方式,答案都是没有限制。尽管实际的限制来自操作系统/外壳和应用程序本身。
答案2
至少有以下几点:
命令选项:
foo --bar
标准输入:
foo | bar
或bar < foo
文件:(
foo *.*
或通过 中的代码打开文件foo
)†环境输出:
export foo=bar; baz
环境(无出口):
foo=bar baz
或env foo=bar baz
这里文档:
foo << EOF bar EOF
这里的字符串:
foo <<< bar
信号
kill -SIGUSR1 $procid
种类齐全进程间通信,如套接字、TCP、内存映射文件
† 是的,我意识到 stdin 是一个文件(或类似文件)。像这样传入文件实际上与传入选项相同