我试图了解shebang是如何工作的,并想知道当您在终端提示符下键入< code>node时会发生什么。想知道它是否在某个地方调用了c函数中的< code>main。使用node有一段时间了,我只懂一些基础知识。The shebang #!/usr/bin/env node
以某种方式读取节点可执行文件,我不确定它是什么或在哪里,以及它从哪里开始。然后是实际计算表达式< code>node并将其定向到shebang的代码,但这可能太复杂了,不好问。
非常精确地说,“shebang”只是两个字符#!
。当Unix系统上的文件被调用为可执行文件时(最终通过系统调用ecuve
),内核会查看其前几个字节来确定它是哪种可执行文件。如果这些字节将其识别为包含机器代码,则内核会将机器代码加载到内存中并使CPU开始执行它。如果机器代码是从C程序编译的,则其main
函数最终会被调用。(如果您想知道这个过程是如何工作的,请阅读John Levine的《链接器和加载器》一书。)
但是如果前两个字节是< code>#和< code >! (ASCII值35和33)然后内核将扫描文件的第一行,查找解释器的名称,然后运行解释器,提供< code>#的名称!作为命令行参数编程。(关于内核如何解析第一行的确切细节,见这个回答。)如果你做了
./foo.js a b c d
而foo.js以< code>#开头!/usr/bin/node,那么内核将表现得好像用参数向量调用了< code>execve
/usr/bin/node ./foo.js a b c d
它将打开文件/usr/bin/node
,发现这是一个机器代码可执行文件,然后继续加载机器代码,这是节点解释器,并运行它。然后,Node的主
函数将注意到它的第一个参数是./foo.js
,它将打开该文件并将其作为Javascript程序执行,而不是进入其交互式读取 - 评估 - 打印循环。
Node 解释器本身会忽略 #!
行,但它的解析器中必须有代码才能忽略它。内核不会过滤掉它。对于Unix上常用的许多解释型语言(sh,awk,perl,python,ruby等),注释从#
运行到行尾,所以这会自动发生;事实上,在当时就选择了 #!
符号,因为 sh 注释是从 #
到行尾的。Javascript 注释不是这样工作的,所以 Node 必须在文件开头为 #!
设置一个特例。
您显示的 #!
行具有额外的间接级别:#! /usr/bin/env 节点
使内核运行带有参数向量的程序 /usr/bin/env
(同样由机器代码组成)
/usr/bin/env node ./foo.js a b c d
env
然后看到它的第一个参数是node
,它沿着名为node
的程序的可执行文件的搜索路径进行查找。搜索路径由环境变量定义:type
echo $PATH
在您的提示下了解它是什么。它是一个以冒号分隔的目录列表。例如,PATH 的一个常见值为
/usr/local/bin:/usr/bin:/bin
这意味着在目录中 /usr/本地/bin
, /usr/bin
和 /bin
中查找程序;换句话说,使用PATH的值以及上面的参数,env
将首先尝试运行
/usr/local/bin/node ./foo.js a b c d
如果这不起作用,它将尝试<code>/usr/bin/node</code>等等。如果您不知道node解释器(或其他)安装在哪里,则需要额外的间接寻址,因为内核的<code>#processing只接受<code>#之后的绝对路径名
;它不会为您进行PATH搜索。如果您确实知道节点
的安装位置,最好直接写入该路径名,这样,程序的行为就不取决于调用用户的PATH是什么(例如,一些Linux发行版使用/usr/bin/node
来表示完全无关的程序,因此,如果您有#!/usr/bin/env节点
,并且用户在其PATH上没有
我为 execve
和以 #!
开头的文件描述的行为不是由 POSIX 指定的(在该页面上提到,但仅在非规范性基本原理部分中)。但是,它在您现在可能遇到的所有类Unix操作系统中都是一致的。我不知道它到底有多老。
问题内容: 我如何在Linux终端上执行C#代码作为Shell脚本。 我有以下示例代码: 当我运行shell bash时,我使用。使用C#怎么做? 问题答案: 该(hashbang)标签是用来告诉使用哪种解释让你的Perl,PHP,庆典,SH等脚本将正确运行shell。 但是C#不是脚本语言,它旨在被编译成可执行格式。如果要使用C#,则至少需要安装编译器和运行时,最好是安装IDE(集成开发环境)来
有人知道如何设置使用cmd的按钮吗?
我似乎一直在尝试在vscode中运行python3文件。我注意到右上角运行代码的三角形按钮也不再是绿色。 我已经为python3建立了自己的venv,并且安装了numpy包——我已经检查了< code>pip list,它在那里,并且在导入时调用这个包中的任何方法时运行良好。 当我右键单击vscode中的文件并单击在终端中运行Python文件时-它运行得非常好,并为我提供了所需的输出。 但是,当我
有什么建议如何在VS Code中的代码和集成终端之间切换? 例如,在 PowerShell ISE 中,它是:Ctr D 终端和 Ctr I 代码 找不到任何类似的VS Code。 提前感谢您的任何建议
我已经使用cp编译了我的代码 导入com。mysql。jdbc。连接 导入com。mysql。jdbc。编制的报表 导入com。mysql。jdbc。声明 导入java。io。* 导入java。sql。DriverManager 导入java。sql。SQLException 导入java。util。ArrayList; 公共类HttpHeaderParser{ 这里有一些java字符串操作。然后
您好,谢谢您在这里看我的问题。 我不熟悉编码,正在学习python。我使用的是Linux,特别是Ubuntu。我编写了一个简单的基于tkinter的应用程序,它在启动时会显示特定日期的倒计时,然后有一个按钮可以单击关闭窗口。我已经在PyCharm中运行了这个应用程序,它在那里工作得非常好。我在空闲时也能跑得很好。在这两种情况下,tkinter都导入并运行良好。 我找到了。py文件用于我在终端中的应