shell 什么是Bash文件扩展名?

mlnl4t2r  于 12个月前  发布在  Shell
关注(0)|答案(5)|浏览(169)

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

pexxcrt2

pexxcrt21#

与其他答案不同的是,有一个常见的约定是对shell脚本使用.sh扩展名--但这不是一个有用的约定。最好根本不使用扩展名。能够从foo.sh的名称中分辨出它是一个shell脚本的好处是微乎其微的,而且您要付出失去灵活性的代价。
要使bash脚本可执行,它需要在顶部有一个shebang行:

#!/bin/bash

字符串
然后使用chmod +x命令,以便系统将其识别为可执行文件。然后需要将其安装在$PATH中列出的某个目录中。如果脚本名为foo,则可以通过键入foo从shell提示符执行它。或者如果它位于当前目录(临时脚本常见),则可以键入./foo
(An社邦线的另一种形式是:

#!/usr/bin/env bash


但有关利弊的讨论,请参见this answer。)
shell和操作系统都不会注意文件名的扩展名部分。它只是名称的一部分。通过 * 不 * 给它一个特殊的扩展名,你可以确保任何人都可以使用它。(用户或其他脚本)不必关心它是如何实现的,无论它是一个shell脚本(sh、bash、csh或其他)、Perl、Python或Awk脚本或二进制可执行文件。系统经过专门设计,可以调用解释脚本或二进制可执行文件,而无需知道或关心其如何实现。
类UNIX系统开始时只有纯文本的命令行界面,后来又添加了KDE和Gnome等GUI。(同样,无论它是脚本还是二进制可执行文件),例如,双击指向它的图标。通常这会丢弃程序可能打印的任何输出,并且不允许传递命令行参数;它比从shell提示符运行它要灵活得多,但对于某些程序(主要是GUI客户端)来说,它可能更方便。
Shell脚本最好从命令行学习,而不是从GUI。
(Some工具 * 确实 * 注意文件扩展名。例如,编译器通常使用扩展名来确定代码编写的语言:.c用于C,.cpp用于c++等。此约定不适用于可执行文件。
请记住,UNIX(和类UNIX系统)不是Windows。MS Windows通常使用文件的扩展名来确定如何打开/执行它。二进制可执行文件需要具有.exe扩展名。如果您在Windows下安装了类UNIX shell,则可以将Windows配置为将.sh扩展名识别为shell脚本,并使用shell打开它; Windows没有#!约定。

t30tvxxf

t30tvxxf2#

您不需要任何扩展(或者您可以选择任意一个,但.sh是一个有用的约定)。
你应该用#!/bin/bash开始你的脚本(第一行可以被execve(2)系统调用理解),你应该让你的文件可以被chmod u+x执行。

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

字符串
在终端中。有关命令,请参阅chmod(1),有关系统调用,请参阅chmod(2)
除非您输入的是整个文件路径,否则应该将该文件放在PATH中提到的某个目录中(请参阅environ(7)execvp(3)),如果您的登录shell是bash,则可以在~/.bashrc中永久设置该目录。
顺便说一句,你可以用其他语言编写脚本,例如在Python中以#!/usr/bin/python开始,或者在Ocaml中以#!/usr/bin/ocaml开始。
通过双击执行脚本(在什么上?你没有说!)是一个desktop environment问题,可能是桌面特定的(可能与KDE,Mate,Gnome,.或IceWM或RatPoison不同)。也许阅读EWMH规范可以帮助你更好地了解。
也许使用chmod使脚本可执行可以使它在桌面上可点击(显然,MacOSX上的Quartz),但是您可能应该使它给予一些视觉反馈。
有几台电脑没有任何桌面,包括你自己的,当你用ssh远程访问它时。
我不认为通过单击来运行shell脚本是一个好主意。您可能希望能够为shell脚本提供给予参数(你怎么能通过点击来做到这一点呢?),并且你应该关心它的输出。如果你能够编写一个shell脚本,你可以在终端中使用交互式shell。这是使用脚本的最好和最自然的方式。好的交互式shell(例如zshfish或最近的bash)有美味和可配置的autocompletion设施,你不必键入很多(学会使用键盘的tab键)。
我从1986年开始使用Unix,从1993年开始使用Linux。我从来没有通过点击来启动我自己的程序或脚本。我为什么要这样做呢?

brccelvz

brccelvz3#

只有.sh .
按如下方式运行脚本:

./script.sh

字符串
编辑:就像anubhava说的,扩展并不重要,但出于组织的原因,仍然建议使用扩展。

zpf6vheq

zpf6vheq4#

我知道这已经很老了,但我觉得这增加了问题的要求。
如果你在mac上,你想通过双击来运行一个脚本,你需要使用.command扩展名。同样,和之前一样,用chmod -x使文件可执行。
如前所述,这并不是真的那么有用。

lpwwtiir

lpwwtiir5#

TL; DR --如果脚本的用户(不一定是开发人员)使用GUI界面,则取决于他们使用的文件浏览器。MacOS的Linux将需要.sh扩展名才能执行脚本。然而,Gnome Nautilus可以正确识别带或不带.sh扩展名的shebanged脚本。

我知道在bash脚本上使用和反对使用扩展的原因已经说过很多次了,但是没有那么多为什么或者为什么不使用扩展,但是我有我认为是一个很好的经验法则。
如果你经常进出bash并使用终端,或者正在为不使用终端的其他人开发工具,请在你的bash脚本上添加.sh扩展名。这样,该脚本的用户可以在GUI文件浏览器中双击该文件来运行该脚本。
如果你是那种主要在终端中完成所有或大部分工作的人,那么就不要费心在你的bash脚本上添加任何扩展。如果你已经设置了~/.bashrc文件来直观地区分脚本和目录,那么它们在终端中就没有任何用处了。
编辑:
在Gnome Nautilus文件浏览器中,使用4个测试文件(每个文件都具有要执行的文件的权限),使用愚蠢简单的bash命令打开终端窗口(gnome-terminal):
1.没有扩展名的文件,第一行是#!/bin/bash
它的工作原理是双击文件。
1.扩展名为.sh的文件,第一行为#!/bin/bash
它的工作原理是双击文件。
1.没有扩展名的文件,第一行没有#!/bin/bash
它通过双击文件来工作.
1.扩展名为.sh的文件,第一行没有#!/bin/bash
它的工作原理是双击文件。
然而,正如基思汤普森在这个答案的评论中明智地指出的那样,依赖于使用.sh扩展名而不是文件第一行(#!/bin/bash)的bash shebang可能会导致问题。
然而,另一个,我记得当我以前使用MacOS时,即使是正确的shebanged(这是一个词吗?)没有.sh扩展名的bash脚本也不能从MacOS上的GUI运行。我希望有人能在评论中纠正我。如果这是真的,这将证明至少有一个文件浏览器在那里.sh扩展名很重要。

相关问题