我正在学习在 Ubuntu 14.04 上使用终端,并在 shell 中运行命令行代码(我被告知是终端内部的内容)来安装程序。但我也可以在 shell 中启动 Node.js 服务器,然后可以在终端中运行 javascript 代码;它跟踪我存储在变量中的值,我可以创建函数然后使用它们等等。然而,它似乎确实改变了模式,因为我不再位于操作系统的特定文件夹中,所以也许我不再位于 shell 中?
所以我开始研究 shell 命令:
什么是“命令?
根据http://linuxcommand.org/lc3_lts0060.php命令可以是 4 种不同类型之一:
一个可执行程序就像 /usr/bin 中的所有文件一样。在此类别中,程序可以编译为二进制文件,例如用 C 和 C++ 编写的程序,或用脚本语言(例如 shell、Perl、Python、Ruby 等)编写的程序。
一个命令内置于外壳本身。 bash 提供了许多内部称为 shell 内置命令的命令。例如,cd 命令是 shell 内置命令。
一个外壳函数。这些是合并到环境中的微型 shell 脚本。
别名。您可以根据其他命令构建自己定义的命令。
这是否意味着每次启动程序时,我总是在 shell 的帮助下运行文件中的更高级别代码(例如 xphp、x.js x.css x.html 文件)?或者这仅仅意味着我可以使用命令行启动一个程序,然后在其他地方运行(如果在其他地方,那么在哪里?)?
如何掌握这些不同类型的代码/语言之间的交互?
例如:您可以将其全部视为放入命令行的代码吗?一些语言一行一行地调用其他语言,然后将控制权返回给调用者等等,或者什么样的心理模型有助于理解正在发生的事情?
答案1
除了自下而上的学习之外,我从未发现任何东西都有助于开发复杂系统的心理模型。
学一点汇编语言——不是很多,足以编写一个数字加法子程序。 Watch 是通过在调试器中单步执行来完成它的任务的。发现指针只不过是机器地址,而字符串实际上是由其中的单元终止的内存单元序列0
(免责声明:在一些语言)。
一旦你知道了这一点,当你用高级语言编写时记住它是你能做的最好的事情,以获得整个系统的连贯图像。您将立即明白为什么有些事情比其他事情慢,以及为什么其他事情需要更多内存。
了解编程语言后,快速浏览一下执行命令外壳的。再说一次,时间不长,足以看出它是一个像其他程序一样的程序,只是它的输入和输出是其他命令。观察它解析命令行,最终您将“明白”为什么带有空格的文件名会造成如此多的麻烦。
或者,查看现代系统启动守护进程的内部,看看它如何使用 shell 脚本、程序和系统调用来实现某些功能(不要对它看起来多么摇摇欲坠感到太震惊。)
这一切都需要时间,但我坚信你不能无需花费大量时间即可对现代计算机这样的复杂系统有一定的了解。更常见的是带着一种半错误的、误导性的心理模型离开(问问任何曾经花一天时间从事技术支持工作的人)。您也不太可能理解堆栈中的所有内容,但这没关系 -没有人了解当今用于计算任何事物的整个堆栈。人类的大脑太慢了,而且太有价值了,不能再尝试这样的特技了。
答案2
您的说法是正确的,当您打开终端时,您正在使用外壳。 shell 的主要工作是帮助您运行可执行程序。
那么什么是可执行文件呢?键入ls
并按回车键。它应该打印出当前目录中的文件。现在,这看起来 shell 正在运行某种名为 的内置命令ls
,对吗?错误的!它实际上是在创建一个新的Linux 过程运行可执行程序/usr/bin/ls
。
那么为什么它要将文件列表写入 shell 呢?嗯,ls
程序对 shell 一无所知。事实上,它并不真正知道要写入哪里。程序员所做的就是让程序将列表写入名为标准输出。然后 shell 使用了一个 Linux 技巧,称为管道使列表打印到终端。
有趣的是,shell还可以让这个标准出来到其他地方。例如,键入ls > /tmp/ls.out
不会打印到终端。它实际上是将列表发送到/tmp
目录中的文件。更有趣的是,键入ls | less
使 shell 启动ls
程序以及less
程序并通过管道传输标准输出的ls
到标准在的less
。这些程序都不知道有关 shell 的任何信息,事实上,shell 也不知道程序如何工作:如果程序是以标准方式编码的,那么它就会正常工作。
现在,让我们来看看这个node.js
例子。同样,shell 刚刚启动了node.js
程序。如果你不提供参数,这个程序会尝试从标准在就像less
。由于您没有通过管道传输任何内容,因此 shell 只是连接了键盘,以便您输入的任何内容都会发送到node
.外壳也挂了标准输出到终端,这样任何node
写入的内容都会像我们看到的那样发送到终端ls
。最终效果使得 shell 现在看起来可以理解 JavaScript,但事实并非如此。它实际上只是理解执行程序和重定向输入/输出(至少在这种情况下)。这是node
在做JS。