在 OS X 上,我试图理解 shell 的整个概念。具体来说,当我登录计算机但不启动终端时,shell 是否已启动?当我打开终端时,它是否会启动不同类型的 shell?我知道在打开终端之前,我以给定用户身份登录计算机,所以我不明白打开计算机时登录与打开终端时登录之间的区别。
有人能对这一切提供一些见解吗?
答案1
---免责声明:不是苹果用户---
shell 是一个解释一系列命令的程序。这些命令可以来自 STDIN(标准输入)或文件。例如:如果您启动一个bash
不带参数的程序,STDIN 将是您的键盘(这是一种简化)。您还可以使用重定向来提供 STDIN,例如:
echo 'echo konijn` | bash
但您也可以使用文件作为输入。例如:如果file.sh
包含
#!/bin/bash
echo 'wiep`
你可以用这个脚本明确地启动一个 shell:
bash file.sh
或者,如果文件已被设为可执行文件,则隐式地:
./file.sh
接下来的问题是:什么启动脚本?在 OS X 上,您可以使用 启动脚本launchd
,或者在 crontab 中启动脚本,同样是显式或隐式的。
那么,如果我们启动一个终端会发生什么?
您的窗口管理器将启动终端。您的终端将启动您与之对话的 shell。终端的存在只是为了方便您与 shell 交互。
帮助我理解正在发生的事情的是确定哪个进程启动了什么,以及 STDIN 和 STDOUT 到哪里。用于ps -ef
确定进程的父进程。