如何通过双击使该file.sh可执行?


165

首先,我使用Mac。

接下来,我需要执行此“ file.sh”,我们将其称为。每当我需要执行它时,我都必须打开Terminal并输入:

cd /Users/Jacob/Documents/folderWithFileInIt
bash file.sh

没关系,但是我觉得如果我双击使文件执行起来会快很多,你不觉得吗?

所以我的问题是,如何通过双击使该文件可执行?

我的想法是:

a)在终端中输入类似chmod之类的内容并更改权限?

b)创建一个文件,将我上面写的代码放在其中^,然后使该文件可执行?

c)以某种方式实现自动化?

哪种方法最好,还是有更好的方法?另外,请您尽可能多地解释一下,我是Terminal的新手。谢谢。


1
如果您想要一个漂亮,易于单击的脚本,那么可以,Automator是正确的工具。您似乎从您的问题中知道这一点,那么您的问题是什么?
罗布·纳皮尔

相同的问题,但我有jdk dmg,一些用于创建图标的应用程序文件夹,一些Jar ..但我无法通过automator或.command运行/创建
SANTOSH

Answers:


349

默认情况下,*.sh在文本编辑器(Xcode或TextEdit)中打开文件。要创建将在终端中执行时执行的shell脚本,请使用“ command”扩展名将其命名,例如,file.command。默认情况下,这些被发送到终端,终端将作为Shell脚本执行文件。

您还需要确保该文件是可执行文件,例如:

chmod +x file.command

没有这个,终端将拒绝执行它。

请注意,#!在这种特定情况下,脚本不必以前缀开头,因为Terminal专门安排使用您的默认Shell执行该脚本。(当然,#!如果要自定义使用哪个外壳程序,或者要确保可以在使用其他外壳程序时从命令行执行它,则可以添加一行。)

还要注意,Terminal在不更改工作目录的情况下执行shell脚本。cd如果实际上需要在特定工作目录下运行脚本,则需要以命令开头。


1
感谢您提供更有用的答案。
Jacob

46
您也可以cd "`dirname "$0"`"用来将当前工作目录设置为Shell skript所在的目录。
gearsdigital

3
出于美学原因,您还应该右键单击.command文件并打开信息。在那里,您可以选择隐藏后缀(在名称和后缀下)。
Bijan 2013年

我使用这种方法通过open -n ...命令运行应用程序。它可以工作,但是每次“终端”窗口打开并显示“ [处理完成]”时。是否可以防止终端窗口出现?
Nik

1
@Nik如果您不希望在终端窗口中显示它,则没有必要在终端中运行它。而是使其成为应用程序束,其可执行文件是shebang脚本。或制作一个运行脚本的AppleScript或Automator小程序。您还可以使用终端首选项来更改配置文件,以在进程退出时关闭窗口,但这不是最好的解决方案,如果您只想运行无需用户干预的shell脚本。
克里斯·佩奇

31

完全删除该扩展名,然后双击它。大多数系统外壳脚本都是这样的。只要它具有shebang,它就会起作用。


1
顺便说一句,“ shebang”通常是任何行前面的这一行:#!/ bin / sh,但可以有所不同,请阅读其他情况下提供的链接。
卢卡斯·里西斯

这种方法不需要做chmod吗?
Atul

11

您可以告诉Finder .sh在终端中打开文件:

  1. 选择文件
  2. 获取信息(cmd-i)
  3. 在“打开方式”部分,从弹出菜单中选择“其他…”
  4. 选择终端作为应用程序

这与重命名为具有完全相同的效果,.command除了……您不必重命名它:)


8
  1. 发射台
  2. 输入-> nano fileName
  3. 粘贴批处理文件内容并保存
  4. 键入-> chmod + x fileName
  5. 它将创建exe文件,现在您可以双击它。

文件名应用双引号引起来。由于我使用的是Mac->对于我来说,批处理文件的内容是

cd /用户/您的姓名/文档/ SeleniumServer

java -jar selenium-server-standalone-3.3.1.jar -role hub

它肯定会工作


0

您可以通过改变文件的可执行chmod这样

chmod 755 file.sh

并使用此命令执行

./file.sh

欢迎来到SO!您的答案不会对已接受的答案添加任何内容。请解释为什么这与已经存在的其他答案不同。
GabrielOshiro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.