Bash 文件扩展名是什么?

我已经在文本编辑器中编写了一个 bash 脚本,我应该将脚本保存为什么扩展,以便它可以作为 bash 脚本运行?我已经创建了一个理论上应该启动 ssh 服务器的脚本。我想知道如何使脚本执行一旦我点击它。我正在运行 OS X 10.9.5。

117630 次浏览

就是 .sh

像这样运行脚本:

./script.sh

编辑: 就像阿努巴娃说的,扩展并不重要。但出于组织原因,仍然建议使用扩展。

您不需要任何扩展(或者您可以选择一个任意的扩展,但是 .sh是一个有用的约定)。

您应该以 #!/bin/bash开始您的脚本(第一行由 执行(2) syscall 理解) ,并且您应该使您的文件可以由 chmod u+x执行。因此,如果您的脚本在某个文件 $HOME/somedir/somescriptname.sh中,则需要键入一次

 chmod u+x  $HOME/somedir/somescriptname.sh

命令见 Chmod (1),系统调用见 Chmod (2)

除非键入整个文件路径,否则应该将该文件放在 PATH中提到的某个目录中(参见 环境(7) & Execvp (3)) ,如果登录 shell 是 bash,则可以在 ~/.bashrc中永久设置该目录

顺便说一句,你可以用其他语言来写脚本,比如 Python,从 #!/usr/bin/python开始,或者从 Ocaml 开始,从 #!/usr/bin/ocaml开始... ..。

通过双击(什么?)执行脚本?你没说!)是一个 桌面环境问题,可能是特定于桌面的(可能与 Kde,Mate,Gnome,... ... 或者 IceWM 或者老鼠毒药)。也许阅读 EWMH规范可以帮助你得到一个更好的图片。

也许使用 chmod可执行您的脚本可能会使它在您的桌面上可点击(显然,在 MacOSX 上的 石英)。但是你也许应该让它给出一些视觉反馈。

And several computers don't have any desktop, including your own when you access it remotely with .

I don't believe it is a good idea to run your shell script by clicking. You probably want to be able to give arguments to your shell script (and how would you do that by clicking?), and you should care about its output. If you are able to write a shell script, you are able to use an interactive shell in a terminal. That it the best and most natural way to use a script. Good interactive shells (e.g. zsh or or perhaps a recent bash) have delicious and configurable autocompletion facilities and you won't have to type a lot (learn to use the tab key of your keyboard). Also, scripts and programs are often parts of composite commands (pipelines, etc...).

附言。我从1986年开始使用 Unix,从1993年开始使用 Linux。我从来没有通过点击来启动我自己的程序或脚本。为什么?

与其他答案不同的是,对 shell 脚本使用 .sh扩展是一个常见的约定——但它不是一个有用的约定。最好不要使用扩展名。能够告诉 foo.sh是一个 shell 脚本的好处是,因为它的名称是最小的,并且您为它付出了灵活性的损失。

要使 bash 脚本可执行,它需要在顶部有一行 开始吧:

#!/bin/bash

并使用 chmod +x命令,以便系统将其识别为可执行文件。然后需要将它安装在 $PATH中列出的目录之一中。如果该脚本名为 foo,那么可以通过键入 foo从 shell 提示符执行它。或者,如果它在工作目录中(临时脚本中常见的) ,你可以输入 ./foo

Shell 和操作系统都不会注意文件名的扩展部分。这只是名字的一部分。通过 没有给它一个特殊的扩展,你可以确保任何使用它的人(不管是用户还是其他脚本)都不必关心它是如何实现的,不管它是 shell 脚本(sh、 bash、 csh 或者其他什么)、 Perl、 Python、 Awk 脚本还是二进制可执行文件。系统经过特别设计,可以调用解释的脚本或二进制可执行文件,而不需要知道或关心它是如何实现的。

与 UNIX 类似的系统最初采用纯文本命令行界面。像 KDE 和 Gnome 这样的 GUI 是后来添加的。在 GUI 桌面系统中,您通常可以通过双击引用它的图标来运行程序(同样,无论是脚本还是二进制可执行文件)。通常,这会丢弃程序可能打印的任何输出,并且不允许您传递命令行参数; 这比从 shell 提示符运行要灵活得多。但是对于一些程序(主要是 GUI 客户端) ,它可能更方便。

Shell 脚本最好从命令行学习,而不是从 GUI。

(一些工具 注意文件扩展名。例如,编译器通常使用扩展来确定代码所使用的语言: .c表示 C,.cpp表示 c + + ,等等。此约定不适用于可执行文件。)

请记住,UNIX (和类 UNIX 系统)不是 Windows。MS Windows 通常使用文件的扩展名来确定如何打开/执行文件。二进制可执行文件需要有一个 .exe扩展名。如果在 Windows 下安装了类似 UNIX 的 shell,则可以将 Windows 配置为将 .sh扩展识别为 shell 脚本,并使用 shell 打开它; Windows 没有 #!约定。

我知道这是相当老了,但我觉得这增加了什么问题是要求。

如果你在 Mac 上,你想通过双击它来运行一个脚本,你需要使用 .command扩展。也与前面一样,使文件可执行与 chmod -x

如前所述,这并没有多大用处。

DR ——如果脚本的用户(不一定是开发人员)正在使用 GUI 接口,这取决于他们正在使用的文件浏览器。MacOS 的 Finder 需要 .sh扩展才能执行脚本。然而,Gnome Nautilus 可以识别带或不带 .sh扩展名的正确的 shebaned 脚本。

我知道在 bash 脚本上使用扩展的理由和反对理由已经被说过很多次了,但是为什么或为什么不使用扩展的理由没有那么多,但是我有一个我认为是很好的经验法则。

如果您是那种进出 bash 并且通常使用终端的人,或者正在为其他不使用终端的人开发一个工具,那么在 bash 脚本中添加一个 .sh扩展。这样,该脚本的用户可以选择在 GUI 文件浏览器中双击该文件来运行该脚本。

如果您是那种主要在终端中完成所有或大部分工作的类型,那么就不必麻烦在 bash 脚本中添加任何扩展。它们在终端中没有任何作用,假设您已经设置了 ~/.bashrc文件,以便在视觉上将脚本与目录区分开来。

编辑:

在 Gnome Nautilus 文件浏览器中,有4个测试文件(每个文件都有执行该文件的权限) ,使用简单的 bash 命令打开一个终端窗口(gnome-terminal) :

  1. A file with NO extension with #!/bin/bash on the first line.

    它通过双击文件来工作。

  2. 扩展名为 .sh的文件,第一行是 #!/bin/bash

    它通过双击文件来工作。

  3. A file with NO extension with NO #!/bin/bash on the first line.

    它通过双击文件来工作... ... 技术上来说,但是 GUI 没有指出它是一个 shell 脚本。它说这只是一个纯文本文件。

  4. 第一行没有 #!/bin/bash的扩展名为 .sh的文件。

    它通过双击文件来工作。

然而,正如 Keith Thompson 在这个答案的评论中明智地指出的那样,依赖于使用 .sh扩展名而不是文件(#!/bin/bash)第一行的 bash shebang 可能会导致问题。

然而,我还记得我以前使用 MacOS 的时候,甚至正确地使用了 shebang (这是一个词吗?)没有 .sh扩展的 bash 脚本无法从 MacOS 上的 GUI 运行。我希望有人能在评论中纠正我这一点。如果这是真的,它将证明至少有一个文件浏览器在那里的 .sh扩展名问题。