【问题标题】:where is documentation of < when it spawns a subshell< 生成子shell时的文档在哪里
【发布时间】:2019-03-17 22:39:14
【问题描述】:

显然

cat file | wc
wc < file

以这种方式使用时,这个“

man <
man '<'

不要透露任何东西;在网络搜索中,该符号是不明确的,因为它在数学上被用作电子邮件中的行前缀。同样,

if [ -r file ]

construct 可以重述为

if test -r file

然后可以找到“测试”实用程序的手册页。 (尝试在方括号中搜索文档!)我要搜索什么名称或字符串来查找有关“

【问题讨论】:

  • 示例第一行出错。应该是cat file | wc
  • 对于 bash,它记录在 3.6 Redirections 中,但是您从哪里知道它会产生一个子 shell?它没有。
  • 对于 POSIX shell,请参阅 here
  • 关于test 的问题已经在我们的知识库中找到了答案,如果单独提出,则会因重复而被关闭。事实上,将它们与重定向问题混在一起会使问题“过于宽泛”。
  • @CharlesDuffy OP 不是在问test,他们说的是不是一样的。那就是他们在问是否就像知道要了解[ 必须了解test。他们在问是否有类似的途径来了解&lt;&gt;

标签: shell unix pipe spawn subshell


【解决方案1】:

显然

轻微的相似之处,但你不能太过分。它们都代表重定向

&lt; 将左侧命令的标准输入流 (stdin) 重定向到右侧的文件。只有当它是外部程序(如wc)时,该命令才会在自己的进程中运行。

| 将左侧命令的标准输出流 (stdout) 重定向到命令的标准输入流 (stdin)正确的。使用的机制称为匿名管道,这两个命令都在它们自己的子进程中运行。

&lt;| 不是命令,它们是 shell 语法的一部分,因此它们不会有任何 man 页面。作为bash 语言的一部分,您必须使用man bash,然后搜索REDIRECTION(用于&lt;)或Pipelines(用于|)。

第 1 节 man 页面是针对程序的,而不是像 shell 这样的特定语言,第 2 节是针对从 C 调用的内核 API 等。所以不要期望特定 shell 的详细信息会显示为单独的手册页。于是就有了man bashman shman cshman zsh等。

令人惊讶的是,[ 是一个内置的 shell:

$ type [
[ is a shell builtin

也称为test。但是:

$ type [[
[[ is a shell keyword

[test[[ 都是命令,在bash 中可以使用help 获取其他文档,例如

$ help [

那么你怎么知道这个符号是一个命令还是语法的一部分呢?通过学习语言,没有其他方法。遵循教程,阅读man bash,查看示例,但最重要的是自己尝试并尝试一下。

这对初学者来说并不容易,但您应该记住,shell 语法是为程序员编写的,以便使用和理解,它从来不是为最终用户设计的。

您说(抱怨?)同一个字符用于不同的含义。这在编程语言中很常见。例如,在 C 中,* 用于限定指针的声明,作为乘法二元运算符,作为半个注释符号,以及作为取消引用指针的一元运算符。各种语言中还有许多其他多用途字符。这部分是因为早期的键盘只能处理 128 个字符的 ASCII 集的可打印部分。使用 Unicode 运算符(例如 Perl 6)的尝试尚未被广泛采用。

【讨论】:

    【解决方案2】:

    &gt;&gt;&gt;&lt;| 是外壳的一部分。它们不是命令。

    man bash(或你的shell手册)

    | 被称为管道。它是操作的名称,而不是符号。 &gt;&lt; 称为输出和输入重定向。

    两个命令

    cat file | wc
    wc < file
    

    做不同的事情,但结果相同(但第二个效率更高)。

    第一个创建一个管道,然后分叉和执行两次(一个用于cat,一个用于wc)。

    第二个重定向stdin,fork和execs一次(仅用于wc)。

    在测试和[]

    [test 的另一个名称,这是正确的。不幸的是 &gt;&lt; 不是命令。所以他们不是他们的手册页,但他们在你的 shell 手册中。您需要了解的关键字是文件重定向输入重定向输出重定向

    参考文献

    https://en.wikipedia.org/wiki/Redirection_(computing)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2015-03-18
    • 2023-03-11
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多