Skip to content

Commit a23c816

Browse files
authored
Auto deploy from GitHub Actions build 714
iBug: [e87f169] Ch06: Add exec*p quirk (#69)
1 parent 33bf928 commit a23c816

2 files changed

Lines changed: 14 additions & 1 deletion

File tree

Ch06/index.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2310,6 +2310,19 @@ <h3 id="run-bash-script">Bash 脚本的运行<a class="headerlink" href="#run-ba
23102310
</div>
23112311
<p>许多 Bash 脚本会在文件首行加上 <code>#!/bin/bash</code> 。这里 <code>#!</code> 符号的名称是 shebang(也叫 sha-bang,即 sharp <code>#</code> 与 bang <code>!</code>)。当一个文本文件首行有 shebang,且以可执行模式执行时,shebang 后的内容会看作这个脚本的解释器和相关参数,系统会执行解释器命令,并将脚本文件的路径作为参数传递给该命令。</p>
23122312
<p>例如,某个 <code>foo.sh</code> 首行为 <code>#!/bin/bash</code>,则执行 <code>./foo.sh</code> 就等于执行 <code>/bin/bash ./foo.sh</code></p>
2313+
<details class="question">
2314+
<summary>没有 shebang 的脚本呢?</summary>
2315+
<p>你可能会注意到,有些脚本并没有 shebang,但是仍然可以在命令行中正常执行。这是因为尽管 Linux 操作系统无法识别这个脚本的解释器(Linux 要求合法的脚本文件前两个字节必须是 <code>#!</code>,否则返回 <code>ENOEXEC</code>),应用程序仍然可以自行采用不同的处理方式,例如:</p>
2316+
<ol>
2317+
<li>如果你当前使用的 shell 是 Bash,它会尝试启动一个新的 Bash 进程来执行该脚本。</li>
2318+
<li>对于一些其他应用程序,如果它们使用的是 <code>execlp</code>, <code>execvp</code><code>execvpe</code> 等 C 语言库函数来运行其他程序的话,含有 <code>p</code> 后缀的 exec 系列函数会尝试调用 <code>/bin/sh</code> 来执行脚本。</li>
2319+
<li>
2320+
<p>如果以上情况都不符合,那么程序可能会直接输出错误信息,例如:</p>
2321+
<div class="highlight"><pre><span></span><code>./foo.sh: Exec format error
2322+
</code></pre></div>
2323+
</li>
2324+
</ol>
2325+
</details>
23132326
<p>Bash 也支持在同一个行中安排多个命令:</p>
23142327
<table>
23152328
<thead>

search/search_index.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)