如何确定哪个 shell 运行脚本?

How is it determined which shell runs a script?

我的Linux里有几个shell,比如bash、sh、zsh...

而且我知道至少有 3 种方法可以指定 shell 来执行我的 shell 脚本:

  1. 在shebang中指定,喜欢#!/usr/bash
  2. 执行时在命令行指定,如sh MyScripts.sh
  3. $SHELL中指定(比如,SHELL=zsh),然后执行./MyScripts.sh
  4. 这样的脚本

所以,我的大问题是当这三种方式之间存在冲突时,哪条规则具有最高优先级?哪个最低?

如果我这样做会怎样 sh MyScripts.zsh?你看,后缀和二进制不匹配。

文件名只是文件名。它们可以是任何东西,除了零字节和 /。后缀仅适用于 humans。它们可以是任何东西。它们在 Linux.

上无关紧要

当您输入 cmd ./filename 时,shell 会执行带有参数 ./filename 的命令 cmdcmdpythonzshbash 还是 wc 都没有关系,它会在第一个参数设置为 ./filename 的情况下执行.现在程序如何处理 字符串 ./filename 取决于程序。 sh 是一个程序,当它有一个不以前导 - 开头的参数时,该程序 sh 会读取名为第一个参数的文件并解释其内容。所以 sh ./filename 作为 sh 脚本执行 ./filename

“解释器”是一种程序,旨在以特定的编程语言解释文件的内容。例如程序 python 是一个 Python 编程语言解释器。 sh 意味着成为 POSIX 兼容的 Shell 编程语言的解释器。等等

当您在 shell 中键入 ./filename 时,然后 shell () 检查文件是否设置了可执行权限。如果是,它会读取文件的前两个字节。如果文件的前两个字节是 #!,那么它会读取到文件第一行的末尾。然后第一行被解释为 运行 文件名的命令。所以当你做 ./filename 并且你有 #!anything_here 那么 shell 运行s anything_here ./filename.

SHELL 在这里是无关的,有时甚至没有设置。它通常是一个变量,设置为当前解释器的路径。因此,如果你想 运行 一个与当前 运行ning 具有相同解释器的文件,你将键入 $SHELL ./filename,因此 shell 可以扩展变量 SHELL 和 运行 该程序与您正在使用的当前解释器相同运行。