我在文本编辑器中编写了一个bash脚本,应该以什么扩展名保存我的脚本,才能将其作为bash脚本运行? 我创建了一个理论上应该启动ssh服务器的脚本。我想知道如何让脚本在我单击它时执行。我正在运行OS X 10.9.5。
#!/bin/bash
chmod +x
命令,使系统将其识别为可执行文件。然后,需要将其安装在列在$PATH
中的一个目录中。如果脚本名为foo
,则可以在shell提示符下键入foo
来执行它。或者,如果它位于当前目录中(临时脚本常见),可以键入./foo
。#!/usr/bin/env bash
deploy.sh
(或deploy.bash
)的脚本和一个名为deploy
的文件夹,其中包含其他的部署逻辑。如果你将脚本重命名为deploy
,它将导致名称冲突。给文件或文件夹命名不同的名称会影响可管理性和可能导致文件排序(如在编辑器中输入ls
等命令)。当然,shebang最终是决定性因素。但是文件扩展名确实有其合理的位置。 - KafosoDeploy
,但是当复制到不区分大小写的文件系统时可能会出现问题。” - Keith Thompson.sh
扩展名可以让它在你想要的编辑器中打开。如果你想在双击时运行一个脚本,给它命名为 .command
扩展名,这样它就会在终端中运行。 - BallpointBen.sh
是一个有用的约定)。你应该以#!/bin/bash
开头(这行代码被execve(2)系统调用理解),并且你应该将你的文件设置为可执行文件 chmod u+x
。因此,如果你的脚本在文件$HOME/somedir/somescriptname.sh
中,你只需键入一次命令即可。 chmod u+x $HOME/somedir/somescriptname.sh
在终端中执行脚本可以使用 chmod(1) 命令或系统调用 chmod(2),除非要输入完整的文件路径,否则应该将文件放在 PATH
中提到的某个目录中(参见 environ(7) 和 execvp(3)),如果您的登录 shell 是 bash
,可以将其永久设置在 ~/.bashrc
中。
顺便说一下,您可以使用其他语言编写脚本,例如以#!/usr/bin/python
开头的 Python 脚本,或以#!/usr/bin/ocaml
开头的 Ocaml 脚本...
通过双击执行脚本是桌面环境的问题,可能与桌面有关(Kde、Mate、Gnome、IceWM 或 RatPoison 等可能不同)。阅读EWMH规范可能会有所帮助。
也许使用 chmod
命令将脚本设为可执行文件,就可以在桌面上点击运行(显然,在 MacOSX 上是 Quartz)。但是,您可能应该让它给出一些视觉反馈。
然而有一些计算机没有桌面环境,包括您通过 ssh 远程访问自己的计算机时。
我认为不建议通过双击运行您的 shell 脚本。您可能想要能够向脚本传递参数(如何通过单击实现这一点?),并且应该关注其输出。如果您能编写 shell 脚本,则能够在终端中使用交互式 shell。这是使用脚本的最佳和最自然的方式。良好的交互式 shell(例如 zsh 或 fish 或最近的bash
)具有美味且可配置的自动完成功能,您不必输入太多内容(学会使用键盘的 tab 键)。此外,脚本和程序通常是复合命令(管道等)的一部分。
PS。我自 1986 年以来使用 Unix,自 1993 年以来使用 Linux。我从未通过单击启动过自己的程序或脚本。为什么我要那样做呢?
chmod +x
而不是chmod u+x
。 - Keith Thompson仅需要 .sh
文件。
按照以下方式运行脚本:
./script.sh
编辑:就像anubhava所说的,扩展名并不是特别重要。但出于组织原因,仍然建议使用扩展名。
.sh
后缀通常只会增加无用的混乱。 - Keith Thompson.sh
扩展名(.bash
的使用较少),但我并不认为这样做有任何用处。如果我将一个脚本命名为foo.sh
,然后决定用Perl重新实现它,我可以要么更改名称(并编辑所有使用该名称的地方),要么让其带有误导性的扩展名。如果我将其命名为foo
,就不会有这个问题。 - Keith Thompsonhead -1 script.foo
或 file script.foo
来判断)。但是如果一切都安装和配置正确,99% 的时间我只想让命令执行它应该执行的操作。对我来说,这并不意味着每次运行命令都必须知道 .py
或 .bash
后缀。 - Keith Thompson我知道这已经很老了,但我觉得这对问题的提问有所补充。
如果你使用的是Mac,并且想通过双击运行脚本,你需要使用.command
扩展名。同样,像之前一样,使用chmod -x
使文件可执行。
正如之前所述,实际上这并不是非常有用。
.sh
扩展名才能执行脚本。然而,Gnome Nautilus可以正确识别有或没有.sh
扩展名的脚本。我知道已经多次说过使用扩展名的优缺点,但为什么使用或不使用扩展名却没有那么多人讨论,我认为有一个好的经验法则。
如果你是那种经常在终端和bash中切换或正在为不使用终端的其他人开发工具的人,请在你的bash脚本中加上.sh
扩展名。这样,该脚本的用户可以选择在GUI文件浏览器中双击该文件来运行脚本。
如果你是那种主要在终端中完成所有或大部分工作的人,请不要在你的bash脚本中加任何扩展名。假设你已经设置好了~/.bashrc
文件以在视觉上区分脚本和目录,它们在终端中将毫无用处。
编辑:
在Gnome Nautilus文件浏览器中,有4个测试文件(每个文件都有执行权限),使用非常简单的bash命令打开终端窗口(gnome-terminal
):
第一行为#!/bin/bash
,没有扩展名的文件。
双击该文件即可运行。
第一行为#!/bin/bash
,扩展名为.sh
的文件。
双击该文件即可运行。
没有扩展名,第一行没有#!/bin/bash
的文件。
双击该文件可以运行,但GUI没有指示它是一个shell脚本,而是显示为纯文本文件。
扩展名为.sh
,第一行没有#!/bin/bash
的文件。
双击该文件即可运行。
#!/bin/bash
的可执行脚本,那么GUI文件浏览器是否会使用sh
来调用它(忽略shebang)?如果是这样,将会引起一些问题。(不同的浏览器的答案可能不同。) - Keith Thompson.sh
后缀,GUI会使用/bin/sh
还是/bin/bash
来执行它?如果它使用bash特定的功能并且使用/bin/sh
调用它,那么它可能会出现错误。如果GUI注意到了shebang,你可以有一个名为foo.sh
的Perl脚本。为什么要以两种不一致的方式指定解释器呢? - Keith Thompson
bash myscript
即可。 - anubhava.sh
为扩展名,但并不一定需要存在扩展名。Linux与Windows不同。用来解释脚本的程序需要在其第一行中指定,应该写成#!/bin/bash
,甚至可以包含参数。 - Havenard#!/bin/bash
。 - Havenard