什么是Bash文件扩展名?

Ame*_*deo 67 bash shell

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

Kei*_*son 80

不同意其他答案,使用.shshell脚本的扩展有一个共同的约定- 但它不是一个有用的约定.最好不要使用扩展名.能够告诉它foo.sh是一个shell脚本的优点是因为它的名字很小,而且你为它付出了代价而失去了灵活性.

要使bash脚本可执行,它需要在顶部有一个shebang行:

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

并使用该chmod +x命令,以便系统将其识别为可执行文件.然后需要将其安装在您的列表中列出的其中一个目录中$PATH.如果调用该脚本,则foo可以通过键入从shell提示符执行该脚本foo.或者,如果它位于当前目录中(临时脚本通用),则可以键入./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没有#!约定.

  • (Necro)如果省略扩展名,则不能使用同名文件夹.因此,例如,您有`deploy.sh`(或`deploy.bash`),以及一个带有其他部署逻辑的文件夹`deploy`.如果将脚本重命名为"deploy",则会导致名称冲突.命名文件或文件夹不同会损害可管理性和可能的​​文件排序(`ls`,编辑器等).当然,shebang - 最终 - 是决定因素.但文件扩展名确实有合适的位置. (3认同)
  • 我的目标是你在第四段中提到的.单击引用它的图标时运行我的脚本. (2认同)
  • @Amedeo:那取决于你的桌面环境.在我使用的那个(Ubuntu下的Cinnamon)中,双击可执行脚本的图标会提示我在终端中运行它,在编辑器中显示它,或者在没有终端的情况下运行它.无论文件扩展名如何,它都会这样做. (2认同)
  • @Kafoso:我认为我不需要有一个脚本和一个同名的目录.如果我这样做,我可能会调用目录`Deploy`,虽然这会在复制到不区分大小写的文件系统时引起问题. (2认同)
  • 在Mac上,*始终*双击文件会在默认应用中打开它们。因此,具有`.sh`扩展名很有帮助,以便在所需的编辑器中打开脚本。如果您想在双击时运行脚本,请给其扩展名.command,并在双击时在终端中运行。 (2认同)

Bas*_*tch 15

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

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

 chmod u+x  $HOME/somedir/somescriptname.sh
Run Code Online (Sandbox Code Playgroud)

在一个终端.有关命令,请参阅chmod(1),对于系统调用,请参阅chmod(2).

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

顺便说一下,你可以用其他语言编写你的脚本,例如用Python开始编写脚本#!/usr/bin/python,或者用Ocaml 编写你的脚本#!/usr/bin/ocaml...

通过双击(关于你没说的内容!)执行你的脚本是一个桌面环境问题,可能是桌面特定的(可能与Kde,Mate,Gnome,....或IceWM或RatPoison不同).也许阅读EWMH规范可能会帮助您获得更好的图片.

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

并且有几台计算机没有任何桌面,包括您使用ssh远程访问它时的桌面.

我不相信通过单击运行shell脚本是个好主意.您可能希望能够为shell脚本提供参数(以及如何通过单击?来执行此操作),并且您应该关心它的输出.如果您能够编写shell脚本,则可以在终端中使用交互式shell.这是使用脚本的最佳和最自然的方式.良好的交互式shell(例如zshfish或者最近的版本bash)具有美味且可配置的自动完成功能,您不必输入很多(学会使用tab键盘的键).此外,脚本和程序通常是复合命令(管道等)的一部分.

PS.我从1986年开始使用Unix,自1993年开始使用Linux.我从未通过点击开始自己的程序或脚本.我为什么要?

  • 我不知道你的桌面是什么(KDE,Gnome,MATE,...).我强烈邀请您在终端中使用命令行,尤其是运行您的脚本(您可能想给他们一些参数;您将如何在桌面上执行此操作?).如果您能够编写shell脚本,则应该能够在终端中以交互方式使用shell (6认同)
  • 好的,所以我在文本编辑器中创建了我的脚本.我将文件保存到桌面.当我点击保存在桌面上的脚本时,我希望它实际上在我点击它时运行. (3认同)
  • 除非有特定的理由限制对所有者的可执行性,否则我会使用`chmod + x`而不是`chmod u + x`. (3认同)
  • 我的观点是,如果您正在编写shell脚本,您应该养成在终端中使用命令行的习惯. (2认同)
  • 我理解,它是我正在工作的项目.我希望脚本在点击后执行.我试图避免使用终端来运行脚本. (2认同)
  • 再次阅读您的答案后,我非常理解您应该通过终端运行 bash 脚本,但这不是重点。我不再试图寻找运行 bash 脚本的方法。我特别询问您是否可以通过单击脚本来运行脚本(对于我正在开发的项目),并且在脚本中我没有要求它输出任何内容。我只想通过点击脚本来执行我在脚本中编写的命令。不必出现任何图形。 (2认同)

Mar*_*men 7

只是.sh

像这样运行脚本:

./script.sh
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您正在运行一个脚本,您通常没有理由关心它是用什么编写的。bash 脚本和二进制可执行文件的执行方式相同。在可执行脚本中添加“.sh”后缀通常是无用的混乱。 (7认同)
  • 我确实看到很多带有“.sh”扩展名的脚本(带有“.bash”扩展名的脚本很少),但我不相信它有任何用处。如果我将一个脚本命名为“foo.sh”,并且后来决定在 Perl 中重新实现它,我可以更改名称(并编辑使用它的所有内容)或保留一个误导性的扩展名。如果我将其命名为“foo”,我就不会遇到这个问题。 (6认同)
  • 是的,但正如我在编辑中所说 - 这是组织脚本的约定 - 不是更多?! (3认同)
  • @jrh当然,有时它很重要(你可以通过运行“head -1 script.foo”或“file script.foo”来判断)。但是,如果所有内容都已正确安装和配置,99% 的情况下我只希望命令执行其应该执行的操作。对我来说,这并不意味着每次运行它时都必须注意“.py”或“.bash”后缀。 (2认同)