Bash 的延伸档名是什么?
What is the Bash file extension?
我在文本编辑器中编写了一个 bash 脚本,我应该将我的脚本保存为什么扩展名以便它可以作为 bash 脚本运行?我创建了一个理论上应该启动 ssh 服务器的脚本。我想知道如何在单击脚本后执行脚本。我正在运行 OS X 10.9.5。
就.sh
.
运行 脚本如下:
./script.sh
编辑:正如 anubhava 所说,扩展名并不重要。但出于组织原因,还是建议使用扩展。
您不需要任何扩展名(或者您可以任意选择一个,但 .sh
是一个有用的约定)。
您应该使用 #!/bin/bash
启动您的脚本(第一行可以被 execve(2) 系统调用理解),并且您应该使您的文件可以通过 chmod u+x
执行。所以如果你的脚本在某个文件中 $HOME/somedir/somescriptname.sh
你需要输入一次
chmod u+x $HOME/somedir/somescriptname.sh
在终端中。有关系统调用,请参阅 chmod(1) for the command and chmod(2)。
除非您键入整个文件路径,否则您应该将该文件放在 PATH
中提到的某个目录中(参见 environ(7) & execvp(3)),您可以在 [=16= 中永久设置该目录] 如果您的登录 shell 是 bash
)
顺便说一句,您可以用其他语言编写脚本,例如在 Python 中以 #!/usr/bin/python
开始,或者在 Ocaml 中以 #!/usr/bin/ocaml
...
开始
通过双击(在什么上?你没说!)执行脚本是一个 desktop environment 问题,可能是特定于桌面的(可能与
Kde、Mate、Gnome、....或 IceWM 或 RatPoison)。也许阅读 EWMH 规范可能会帮助您获得更好的画面。
也许使您的脚本可执行 chmod
可能会使其在您的桌面上可点击(显然,Quartz 在 MacOSX 上)。但是你可能应该让它提供一些视觉反馈。
并且有几台计算机没有任何桌面,包括您自己的,当您使用 ssh 远程访问它时。
我认为通过单击 运行 您的 shell 脚本不是一个好主意。您可能希望能够为您的 shell 脚本提供参数(您将如何通过单击来实现?),并且您应该关心它的输出。如果您能够编写 shell 脚本,则可以在终端中使用交互式 shell。这是使用脚本的最佳和最自然的方式。良好的互动 shells(例如 zsh or fish or perhaps a recent bash
) have delicious and configurable autocompletion 设施,您不必输入很多内容(学习使用键盘的 tab 键)。另外,脚本和程序通常是复合命令(管道等)的一部分。
PS。我从 1986 年开始使用 Unix,从 1993 年开始使用 Linux。我从来没有通过单击来启动我自己的程序或脚本。我为什么要?
不同意其他答案,对于 shell 脚本使用 .sh
扩展是一个常见的约定——但这不是一个有用的约定。最好根本不要使用扩展名。能够分辨出 foo.sh
是一个 shell 脚本的好处是它的名字是最小的,而且你为此付出了灵活性的损失。
要使 bash 脚本可执行,它需要在顶部有一个 shebang 行:
#!/bin/bash
并使用chmod +x
命令,让系统识别为可执行文件。然后需要将其安装在 $PATH
中列出的目录之一中。如果脚本名为 foo
,则您可以在 shell 提示符下键入 foo
来执行它。或者如果它在当前目录中(临时脚本常见),您可以键入 ./foo
.
shell 和操作系统都不会注意文件名的扩展部分。这只是名字的一部分。通过 not 给它一个特殊的扩展名,你确保使用它的任何人(用户或其他脚本)都不必关心它是如何实现的,无论它是 shell 脚本(sh、bash、csh 或其他)、Perl、Python、Awk 脚本或二进制可执行文件。该系统经过专门设计,因此可以在不知道或不关心其实现方式的情况下调用解释脚本或二进制可执行文件。
类 UNIX 系统从纯文本命令行界面开始。后来添加了 KDE 和 Gnome 等 GUI。在 GUI 桌面系统中,您通常可以 运行 程序(同样,无论是脚本还是二进制可执行文件),例如,双击引用它的图标。通常,这会丢弃程序可能打印的任何输出,并且不允许您传递命令行参数;它比 运行 在 shell 提示符下灵活得多。但对于某些程序(主要是 GUI 客户端),它可能更方便。
Shell 最好从命令行学习脚本,而不是从 GUI。
(一些工具做注意文件扩展名。例如,编译器通常使用扩展名来确定代码编写的语言:.c
for C , .cpp
对于 c++ 等。此约定不适用于可执行文件。)
请记住,UNIX(和类 UNIX 系统)不是 Windows。 MS Windows 通常使用文件的扩展名来确定如何 open/execute 它。二进制可执行文件需要有一个 .exe
扩展名。如果您在 Windows 下安装了类 UNIX shell,您可以配置 Windows 将 .sh
扩展识别为 shell 脚本,并使用 shell打开它; Windows 没有 #!
约定。
我知道这已经很老了,但我觉得这增加了问题的要求。
如果您在 mac 上并且希望能够通过双击脚本来 运行 脚本,则需要使用 .command
扩展。也与之前使用 chmod -x
使文件可执行一样。
如前所述,这并不是真的很有用。
TL;DR -- 如果脚本的用户(不一定是开发人员)使用的是 GUI 界面,则取决于他们使用的文件浏览器。 MacOS 的 Finder 需要 .sh
扩展名才能执行脚本。但是,Gnome Nautilus 可以正确识别带或不带 .sh
扩展名的 shebanged 脚本。
我知道已经有人多次说过支持和反对在 bash 脚本上使用扩展的原因,但没有那么多为什么或为什么不使用扩展,但我认为这是一个好的经验法则。
如果您是那种经常进出 bash 并经常使用终端的人,或者正在为不使用终端的其他人开发工具,请输入 .sh
bash 脚本的扩展。这样,该脚本的用户可以选择在 GUI 文件浏览器中双击该文件以 运行 脚本。
如果您是那种主要在终端中完成所有或大部分工作的类型,请不要为 bash 脚本添加任何扩展。假设您已经设置 ~/.bashrc
文件以在视觉上区分脚本与目录,它们在终端中将毫无用处。
编辑:
在 Gnome Nautilus 文件浏览器中,有 4 个测试文件(每个文件都具有要执行的文件的权限),使用非常简单的 bash 命令打开终端 window(gnome-terminal
):
没有扩展名的文件,第一行有 #!/bin/bash
。
双击文件即可。
扩展名为 .sh
且第一行为 #!/bin/bash
的文件。
双击文件即可。
没有扩展名且第一行没有 #!/bin/bash
的文件。
它通过双击文件工作...从技术上讲,但 GUI 没有显示它是一个 shell 脚本。它说它只是一个纯文本文件。
扩展名为 .sh
且第一行没有 #!/bin/bash
的文件。
双击文件即可。
然而,正如 Keith Thompson 在此答案的评论中明智地指出的那样,依赖于使用 .sh
扩展名而不是文件第一行的 bash shebang( #!/bin/bash
) 它可能会导致问题。
然而,我记得我以前使用 MacOS 时,即使正确地 shebanged(这是一个词吗?) bash 没有 .sh
扩展名的脚本也不能 运行从 MacOS 上的 GUI。不过,我希望有人在评论中纠正我的错误。如果这是真的,那将证明至少有一个文件浏览器 .sh
扩展名很重要。
我在文本编辑器中编写了一个 bash 脚本,我应该将我的脚本保存为什么扩展名以便它可以作为 bash 脚本运行?我创建了一个理论上应该启动 ssh 服务器的脚本。我想知道如何在单击脚本后执行脚本。我正在运行 OS X 10.9.5。
就.sh
.
运行 脚本如下:
./script.sh
编辑:正如 anubhava 所说,扩展名并不重要。但出于组织原因,还是建议使用扩展。
您不需要任何扩展名(或者您可以任意选择一个,但 .sh
是一个有用的约定)。
您应该使用 #!/bin/bash
启动您的脚本(第一行可以被 execve(2) 系统调用理解),并且您应该使您的文件可以通过 chmod u+x
执行。所以如果你的脚本在某个文件中 $HOME/somedir/somescriptname.sh
你需要输入一次
chmod u+x $HOME/somedir/somescriptname.sh
在终端中。有关系统调用,请参阅 chmod(1) for the command and chmod(2)。
除非您键入整个文件路径,否则您应该将该文件放在 PATH
中提到的某个目录中(参见 environ(7) & execvp(3)),您可以在 [=16= 中永久设置该目录] 如果您的登录 shell 是 bash
)
顺便说一句,您可以用其他语言编写脚本,例如在 Python 中以 #!/usr/bin/python
开始,或者在 Ocaml 中以 #!/usr/bin/ocaml
...
通过双击(在什么上?你没说!)执行脚本是一个 desktop environment 问题,可能是特定于桌面的(可能与 Kde、Mate、Gnome、....或 IceWM 或 RatPoison)。也许阅读 EWMH 规范可能会帮助您获得更好的画面。
也许使您的脚本可执行 chmod
可能会使其在您的桌面上可点击(显然,Quartz 在 MacOSX 上)。但是你可能应该让它提供一些视觉反馈。
并且有几台计算机没有任何桌面,包括您自己的,当您使用 ssh 远程访问它时。
我认为通过单击 运行 您的 shell 脚本不是一个好主意。您可能希望能够为您的 shell 脚本提供参数(您将如何通过单击来实现?),并且您应该关心它的输出。如果您能够编写 shell 脚本,则可以在终端中使用交互式 shell。这是使用脚本的最佳和最自然的方式。良好的互动 shells(例如 zsh or fish or perhaps a recent bash
) have delicious and configurable autocompletion 设施,您不必输入很多内容(学习使用键盘的 tab 键)。另外,脚本和程序通常是复合命令(管道等)的一部分。
PS。我从 1986 年开始使用 Unix,从 1993 年开始使用 Linux。我从来没有通过单击来启动我自己的程序或脚本。我为什么要?
不同意其他答案,对于 shell 脚本使用 .sh
扩展是一个常见的约定——但这不是一个有用的约定。最好根本不要使用扩展名。能够分辨出 foo.sh
是一个 shell 脚本的好处是它的名字是最小的,而且你为此付出了灵活性的损失。
要使 bash 脚本可执行,它需要在顶部有一个 shebang 行:
#!/bin/bash
并使用chmod +x
命令,让系统识别为可执行文件。然后需要将其安装在 $PATH
中列出的目录之一中。如果脚本名为 foo
,则您可以在 shell 提示符下键入 foo
来执行它。或者如果它在当前目录中(临时脚本常见),您可以键入 ./foo
.
shell 和操作系统都不会注意文件名的扩展部分。这只是名字的一部分。通过 not 给它一个特殊的扩展名,你确保使用它的任何人(用户或其他脚本)都不必关心它是如何实现的,无论它是 shell 脚本(sh、bash、csh 或其他)、Perl、Python、Awk 脚本或二进制可执行文件。该系统经过专门设计,因此可以在不知道或不关心其实现方式的情况下调用解释脚本或二进制可执行文件。
类 UNIX 系统从纯文本命令行界面开始。后来添加了 KDE 和 Gnome 等 GUI。在 GUI 桌面系统中,您通常可以 运行 程序(同样,无论是脚本还是二进制可执行文件),例如,双击引用它的图标。通常,这会丢弃程序可能打印的任何输出,并且不允许您传递命令行参数;它比 运行 在 shell 提示符下灵活得多。但对于某些程序(主要是 GUI 客户端),它可能更方便。
Shell 最好从命令行学习脚本,而不是从 GUI。
(一些工具做注意文件扩展名。例如,编译器通常使用扩展名来确定代码编写的语言:.c
for C , .cpp
对于 c++ 等。此约定不适用于可执行文件。)
请记住,UNIX(和类 UNIX 系统)不是 Windows。 MS Windows 通常使用文件的扩展名来确定如何 open/execute 它。二进制可执行文件需要有一个 .exe
扩展名。如果您在 Windows 下安装了类 UNIX shell,您可以配置 Windows 将 .sh
扩展识别为 shell 脚本,并使用 shell打开它; Windows 没有 #!
约定。
我知道这已经很老了,但我觉得这增加了问题的要求。
如果您在 mac 上并且希望能够通过双击脚本来 运行 脚本,则需要使用 .command
扩展。也与之前使用 chmod -x
使文件可执行一样。
如前所述,这并不是真的很有用。
TL;DR -- 如果脚本的用户(不一定是开发人员)使用的是 GUI 界面,则取决于他们使用的文件浏览器。 MacOS 的 Finder 需要 .sh
扩展名才能执行脚本。但是,Gnome Nautilus 可以正确识别带或不带 .sh
扩展名的 shebanged 脚本。
我知道已经有人多次说过支持和反对在 bash 脚本上使用扩展的原因,但没有那么多为什么或为什么不使用扩展,但我认为这是一个好的经验法则。
如果您是那种经常进出 bash 并经常使用终端的人,或者正在为不使用终端的其他人开发工具,请输入 .sh
bash 脚本的扩展。这样,该脚本的用户可以选择在 GUI 文件浏览器中双击该文件以 运行 脚本。
如果您是那种主要在终端中完成所有或大部分工作的类型,请不要为 bash 脚本添加任何扩展。假设您已经设置 ~/.bashrc
文件以在视觉上区分脚本与目录,它们在终端中将毫无用处。
编辑:
在 Gnome Nautilus 文件浏览器中,有 4 个测试文件(每个文件都具有要执行的文件的权限),使用非常简单的 bash 命令打开终端 window(gnome-terminal
):
没有扩展名的文件,第一行有
#!/bin/bash
。双击文件即可。
扩展名为
.sh
且第一行为#!/bin/bash
的文件。双击文件即可。
没有扩展名且第一行没有
#!/bin/bash
的文件。它通过双击文件工作...从技术上讲,但 GUI 没有显示它是一个 shell 脚本。它说它只是一个纯文本文件。
扩展名为
.sh
且第一行没有#!/bin/bash
的文件。双击文件即可。
然而,正如 Keith Thompson 在此答案的评论中明智地指出的那样,依赖于使用 .sh
扩展名而不是文件第一行的 bash shebang( #!/bin/bash
) 它可能会导致问题。
然而,我记得我以前使用 MacOS 时,即使正确地 shebanged(这是一个词吗?) bash 没有 .sh
扩展名的脚本也不能 运行从 MacOS 上的 GUI。不过,我希望有人在评论中纠正我的错误。如果这是真的,那将证明至少有一个文件浏览器 .sh
扩展名很重要。