我在文本编辑器中编写了一个bash脚本,我应该保存什么扩展名才能使我的脚本作为bash脚本运行?我创建了一个脚本,理论上应该启动一个ssh服务器。我想知道如何在点击它时执行脚本。我运行的是OS X 10.9.5。
pexxcrt21#
与其他答案不同的是,有一个常见的约定是对shell脚本使用.sh扩展名--但这不是一个有用的约定。最好根本不使用扩展名。能够从foo.sh的名称中分辨出它是一个shell脚本的好处是微乎其微的,而且您要付出失去灵活性的代价。要使bash脚本可执行,它需要在顶部有一个shebang行:
.sh
foo.sh
#!/bin/bash
字符串然后使用chmod +x命令,以便系统将其识别为可执行文件。然后需要将其安装在$PATH中列出的某个目录中。如果脚本名为foo,则可以通过键入foo从shell提示符执行它。或者如果它位于当前目录(临时脚本常见),则可以键入./foo。(An社邦线的另一种形式是:
chmod +x
$PATH
foo
./foo
#!/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没有#!约定。
.c
.cpp
.exe
#!
t30tvxxf2#
您不需要任何扩展(或者您可以选择任意一个,但.sh是一个有用的约定)。你应该用#!/bin/bash开始你的脚本(第一行可以被execve(2)系统调用理解),你应该让你的文件可以被chmod u+x执行。
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(例如zsh或fish或最近的bash)有美味和可配置的autocompletion设施,你不必键入很多(学会使用键盘的tab键)。我从1986年开始使用Unix,从1993年开始使用Linux。我从来没有通过点击来启动我自己的程序或脚本。我为什么要这样做呢?
PATH
bash
~/.bashrc
#!/usr/bin/python
#!/usr/bin/ocaml
chmod
brccelvz3#
只有.sh .按如下方式运行脚本:
./script.sh
字符串编辑:就像anubhava说的,扩展并不重要,但出于组织的原因,仍然建议使用扩展。
zpf6vheq4#
我知道这已经很老了,但我觉得这增加了问题的要求。如果你在mac上,你想通过双击来运行一个脚本,你需要使用.command扩展名。同样,和之前一样,用chmod -x使文件可执行。如前所述,这并不是真的那么有用。
.command
chmod -x
lpwwtiir5#
我知道在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扩展名很重要。
gnome-terminal
5条答案
按热度按时间pexxcrt21#
与其他答案不同的是,有一个常见的约定是对shell脚本使用
.sh
扩展名--但这不是一个有用的约定。最好根本不使用扩展名。能够从foo.sh
的名称中分辨出它是一个shell脚本的好处是微乎其微的,而且您要付出失去灵活性的代价。要使bash脚本可执行,它需要在顶部有一个shebang行:
字符串
然后使用
chmod +x
命令,以便系统将其识别为可执行文件。然后需要将其安装在$PATH
中列出的某个目录中。如果脚本名为foo
,则可以通过键入foo
从shell提示符执行它。或者如果它位于当前目录(临时脚本常见),则可以键入./foo
。(An社邦线的另一种形式是:
型
但有关利弊的讨论,请参见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没有#!
约定。t30tvxxf2#
您不需要任何扩展(或者您可以选择任意一个,但
.sh
是一个有用的约定)。你应该用
#!/bin/bash
开始你的脚本(第一行可以被execve(2)系统调用理解),你应该让你的文件可以被chmod u+x
执行。字符串
在终端中。有关命令,请参阅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(例如zsh或fish或最近的
bash
)有美味和可配置的autocompletion设施,你不必键入很多(学会使用键盘的tab键)。我从1986年开始使用Unix,从1993年开始使用Linux。我从来没有通过点击来启动我自己的程序或脚本。我为什么要这样做呢?
brccelvz3#
只有
.sh
.按如下方式运行脚本:
字符串
编辑:就像anubhava说的,扩展并不重要,但出于组织的原因,仍然建议使用扩展。
zpf6vheq4#
我知道这已经很老了,但我觉得这增加了问题的要求。
如果你在mac上,你想通过双击来运行一个脚本,你需要使用
.command
扩展名。同样,和之前一样,用chmod -x
使文件可执行。如前所述,这并不是真的那么有用。
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
扩展名很重要。