我知道在 Linux 中有两个执行阶段,处理我们运行的每个命令。我会说出我对它们的理解方式,因为我不知道原文的措辞:
外壳处理---外壳编辑命令(将其拆分为不同的行等),所有这些都在与当前外壳不同的外壳中完成。
在 shell 处理之后执行结果(在我们使用的原始 shell 中)。
有人可以回答这些操作的名称并参考他认为最适合新学习者的一些阅读材料吗?
- 外壳处理---外壳编辑命令(将其拆分为不同的行等)
是的,有点。shell 将命令作为单个字符串(通常是一行输入)获取,并将其转换为一组字符串,这些字符串实际上会转到它最终运行的可执行文件。shell 将空格分隔的单词从单个字符串拆分为多个字符串,还处理引号和扩展变量等。
所以,像
ls "$options" "/filename with spaces"
Run Code Online (Sandbox Code Playgroud)
可能会导致三个字符串ls
, -l
(来自 的值$options
)和/filename with spaces
(去除引号)。这些被传递给exec()
运行程序的系统调用。
所有这些都是在与当前不同的 shell 中完成的。
不,不是真的。一些 shell 扩展(如$( ... )
)会产生子shell 来完成繁重的工作,但这不会发生在常规的“简单”命令行中。
- 在 shell 处理之后执行结果(在我们使用的原始 shell 中)。
实际上在解析命令行之后执行程序是一个逻辑上独立的步骤。但从技术上讲,这发生在另一个进程中,因为在 Unix 上运行另一个程序的方式涉及首先调用fork()
,它创建一个新进程作为第一个进程的副本,然后调用exec()
以用实际程序替换这个副本(外壳程序)运行(ls
在示例中说)。
如果命令以exec
( 如) 开头exec ls
,则跳过分叉,shell 将自己替换为它正在启动的命令。
就像评论中提到的那样,shell 内置函数(就像echo
在许多 shell 中一样)也经常在同一进程中运行,而无需分叉。
(以上所有内容都有些简化。真正的外壳可能具有此处未描述的其他功能。)
归档时间: |
|
查看次数: |
189 次 |
最近记录: |