什么是Bash文件扩展名?

时间:2015-01-07 06:23:18

标签: bash shell

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

5 个答案:

答案 0 :(得分:63)

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

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

#!/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,{{1}这个约定不适用于可执行文件。)

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

答案 1 :(得分:15)

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

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

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

在终端。有关命令,请参阅chmod(1);有关系统调用,请参阅chmod(2)

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

,则为bash

BTW,您可以用其他语言编写脚本,例如:在Python中使用#!/usr/bin/python启动它,或者在Ocaml中使用#!/usr/bin/ocaml启动它...

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

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

当您使用ssh远程访问桌面时,有几台计算机没有任何桌面,包括您自己的桌面。

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

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

答案 2 :(得分:2)

只是.sh

运行如下脚本:

./script.sh
编辑:就像anubhava所说,扩展并不重要。但出于组织原因,仍建议使用扩展程序。

答案 3 :(得分:2)

我知道现在已经很老了,但我觉得这会增加问题所要求的内容。

如果您在Mac上并希望能够通过双击运行脚本,则需要使用扩展名。与使用

package com.example.abz.layouts;

        import android.os.Looper;
        import android.widget.Button;

        import java.util.ArrayList;
        import java.util.Random;
        import java.util.Timer;
        import java.util.logging.Handler;


public class RandomSequence {

    public ArrayList<Button> sequence;
    private ArrayList<Button> buttons;
    private int length;

    public RandomSequence(ArrayList<Button> buttons, int low, int high) {
        this.buttons = buttons;

        length = newRandomNumber(low, high);
        sequence = generateRandomSequence();

    }

    public void startSequence() {
        Timer timer = new Timer();
        timer.schedule(new HighLight(sequence), 0, 1500);
    }

    private ArrayList<Button> generateRandomSequence() {
        ArrayList<Button> randomSequence = new ArrayList<>();
        for (int i = 1; i <= length; i++) {
            int random = newRandomNumber(0, buttons.size());
            Button button = buttons.get(random);
            // Ensure not same number in a row
            while (randomSequence.size() > 0 && button.getId() == randomSequence.get(randomSequence.size() - 1).getId()) {
                random = newRandomNumber(0, buttons.size());
                button = buttons.get(random);
            }
            randomSequence.add(buttons.get(random));
        }
        return randomSequence;
    }

    private int newRandomNumber(int low, int high) {
        Random r = new Random();
        return r.nextInt(high - low) + low;
    }
}
生成文件可执行文件之前相同。

如前所述,这并不是真正有用的。

答案 4 :(得分:0)

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

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

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

如果您是主要负责终端中所有或大部分工作的类型,请不要在bash脚本上添加任何扩展名。假设您已经设置了~/.bashrc文件以直观地将脚本与目录区分开,它们在终端中将毫无用处。

编辑:

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

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

    双击文件即可。

  2. 扩展名为.sh且第一行带有#!/bin/bash的文件。

    双击文件即可。

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

    它是通过双击文件来工作的...从技术上讲,但是GUI并未表明它是一个Shell脚本。它说这只是纯文本文件。

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

    双击文件即可。

但是,正如Keith Thompson明智地指出的那样,它依靠使用.sh扩展名而不是文件第一行(#!/bin/bash上的bash shebang扩展名)可能会引起问题。

但是,还有另一件事,我记得当我以前使用MacOS时,即使没有.sh扩展名的bash脚本,也无法从MacOS上的GUI运行,即使正确地敲响了(这是一个词吗?)。我希望有人在评论中对此进行纠正。如果真是这样,那将证明至少有一个文件浏览器可以扩展.sh