【问题标题】:How does 'ls' command work when it has multiple arguments?'ls' 命令在有多个参数时如何工作?
【发布时间】:2016-11-19 04:02:02
【问题描述】:

How does the 'ls' command work in Linux/Unix?

所以这是一些参考。

但我想知道如何使用诸如

之类的命令
ls -1 | grep 'myfile'

将由 shell 执行,即何时调用 exec,何时调用 fork,何时调用 id dup(如果有的话)。

另外,这整个命令是如何解析的?

【问题讨论】:

  • 如果你想查看系统调用是什么,只需运行strace
  • strace + 命令中的所有内容?
  • 阅读手册。搜索网页。试试看。如果您仍有问题,请回来。
  • Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super UserUnix & Linux Stack Exchange 会是一个更好的提问地方。另见Where do I post questions about Dev Ops?
  • ls 命令对多个参数的处理几乎是微不足道的(它在argv 上循环),而且只是您所询问的内容的一小部分。就此而言,您用作示例的命令甚至没有将多个参数传递给ls。如果您将问题发布到更合适的网站,则需要对其进行大量清理。

标签: linux shell


【解决方案1】:

fork 做了什么

Fork 是在类 Unix 操作系统上创建进程的主要(历史上也是唯一的)方法。

exec 做了什么

在计算中,exec 是操作系统的一种功能,它在现有进程的上下文中运行可执行文件

这是什么意思
当您运行一个命令(不是像exitcd 那样内置的命令)时,shell 使用fork 创建一个子进程。这个子进程然后使用exec 执行该命令的二进制文件(例如:/bin/ls)

输入/输出重定向期间会发生什么
每个进程都提供三个流标准输入 (STDIN)、标准输出 (STDOUT) 和标准错误 (STDERR)。默认情况下,这些流映射到父进程的各自流。因此,像 wcnano 这样从 STDIN 读取的命令可以提供来自父 shell 进程的 STDIN 的数据,并且它们的输出被父 shell 进程捕获并显示。

但是,当使用重定向时

ls /tmp /abcd 1>out.log and 2>err.log

stdout 现在映射到out.log 的文件输出流,类似地,stderr 映射到err.log。并将输出写入相应的文件。

管道链接

ls -1 | grep 'myfile'

在 shell PIPE 中,| 用于链接第一个命令的 STDOUT 到第二个命令的 STDIN。

这意味着ls -1(文件和目录列表)的输出作为输入提供给grep myfile,它搜索包含“myfile”的行并打印到其STDOUT。组合效果是搜索包含字符序列“myfile”的文件名

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 2020-11-21
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多