如何确定哪个 shell 运行脚本?
How is it determined which shell runs a script?
我的Linux里有几个shell,比如bash、sh、zsh...
而且我知道至少有 3 种方法可以指定 shell 来执行我的 shell 脚本:
- 在shebang中指定,喜欢
#!/usr/bash
- 执行时在命令行指定,如
sh MyScripts.sh
- 在
$SHELL
中指定(比如,SHELL=zsh
),然后执行./MyScripts.sh
这样的脚本
所以,我的大问题是当这三种方式之间存在冲突时,哪条规则具有最高优先级?哪个最低?
如果我这样做会怎样 sh MyScripts.zsh
?你看,后缀和二进制不匹配。
文件名只是文件名。它们可以是任何东西,除了零字节和 /
。后缀仅适用于 humans。它们可以是任何东西。它们在 Linux.
上无关紧要
当您输入 cmd ./filename
时,shell 会执行带有参数 ./filename
的命令 cmd
。 cmd
是 python
、zsh
、bash
还是 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
和 运行 该程序与您正在使用的当前解释器相同运行。
我的Linux里有几个shell,比如bash、sh、zsh...
而且我知道至少有 3 种方法可以指定 shell 来执行我的 shell 脚本:
- 在shebang中指定,喜欢
#!/usr/bash
- 执行时在命令行指定,如
sh MyScripts.sh
- 在
$SHELL
中指定(比如,SHELL=zsh
),然后执行./MyScripts.sh
这样的脚本
所以,我的大问题是当这三种方式之间存在冲突时,哪条规则具有最高优先级?哪个最低?
如果我这样做会怎样 sh MyScripts.zsh
?你看,后缀和二进制不匹配。
文件名只是文件名。它们可以是任何东西,除了零字节和 /
。后缀仅适用于 humans。它们可以是任何东西。它们在 Linux.
当您输入 cmd ./filename
时,shell 会执行带有参数 ./filename
的命令 cmd
。 cmd
是 python
、zsh
、bash
还是 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
和 运行 该程序与您正在使用的当前解释器相同运行。