我在文本编辑器中编写了一个bash脚本,我将脚本保存为什么扩展名,因为它可以作为bash脚本运行?我创建了一个理论上应该启动ssh服务器的脚本。我想知道如何在我点击它之后使脚本执行。我正在运行OS X 10.9.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。这是使用脚本的最佳和最自然的方式。良好的互动外壳(例如zsh或fish或最近的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)
.sh
才能执行脚本。但是,Gnome Nautilus可以正确识别带有或不带有.sh
扩展名的脚本。我知道已经多次说过在bash脚本上使用扩展名的理由和反对,但是没有太多为什么或为什么不使用扩展名的理由,但是我认为这是一个很好的经验法则。 / p>
如果您是那种跳入bash并退出bash并通常使用终端的类型,或者正在为不使用终端的其他人开发工具,请在您的bash脚本上添加.sh
扩展名。这样,该脚本的用户可以选择在GUI文件浏览器中双击该文件以运行该脚本。
如果您是主要负责终端中所有或大部分工作的类型,请不要在bash脚本上添加任何扩展名。假设您已经设置了~/.bashrc
文件以直观地将脚本与目录区分开,它们在终端中将毫无用处。
编辑:
在带有4个测试文件(每个文件都具有要执行的文件的权限)的Gnome Nautilus文件浏览器中,使用愚蠢的bash命令打开终端窗口(gnome-terminal
):
第一行中没有扩展名为#!/bin/bash
的文件。
双击文件即可。
扩展名为.sh
且第一行带有#!/bin/bash
的文件。
双击文件即可。
第一行没有扩展名为NO #!/bin/bash
的文件。
它是通过双击文件来工作的...从技术上讲,但是GUI并未表明它是一个Shell脚本。它说这只是纯文本文件。
扩展名为.sh
且第一行没有#!/bin/bash
的文件。
双击文件即可。
但是,正如Keith Thompson明智地指出的那样,它依靠使用.sh
扩展名而不是文件第一行(#!/bin/bash
上的bash shebang扩展名)可能会引起问题。
但是,还有另一件事,我记得当我以前使用MacOS时,即使没有.sh
扩展名的bash脚本,也无法从MacOS上的GUI运行,即使正确地敲响了(这是一个词吗?)。我希望有人在评论中对此进行纠正。如果真是这样,那将证明至少有一个文件浏览器可以扩展.sh
。