第1部分 好的,我正在使用 Mac,并且我从一个名为...的文件开始。
例子:myFile.sh
在终端中,我通过输入以下内容在其目录中运行此文件......
bash myFile.sh
这很完美,但是后来我对 bash 与 sh 进行了一些研究,发现我也可以这样写......
sh myFile.sh
这也奏效了。我做了一些研究,然后想到了一个主意,因为 bash 是“较新”的做事方式,我想我会尝试重命名,myFile.sh
看看myFile.bash
如果我输入以下内容,它是否仍会在终端中运行...
bash myFile.bash
而且它运行得很好!但现在我想知道文件最初被命名myFile.sh
为myFile.bash
myFile.bash
那么,我将其重命名为而不是是不是不好myFile.sh
?还是完全没问题?
(我对终端命令还不熟悉)
第2部分
另一个问题:我该如何使这个“myFile.sh”可执行?这是以下 myFile.sh 的内容:
#!/bin/bash
python runtime/recompile.py "$@"
注意:我做了一些研究,并尝试将 myFile.sh 重命名为 myFile.command,这应该使它在我打开文件时可执行,但它不起作用,并且我在终端中收到此错误:
python: can't open file 'runtime/recompile.py': [Errno 2] No such file or directory
所以我的问题确实是:
a) 如何使 myFile.sh 在终端中可执行?b) 为什么不能将 myFile.sh 重命名为 myFile.command?
任何帮助均感激不尽。
答案1
没问题,它可以在不同扩展名下工作,也可以在没有扩展名的情况下工作。文件扩展名在 Unix 中毫无意义(参考:http://developers.sun.com/solaris/articles/korn_shell.html)。扩展名有助于人们快速识别文件。
您可能应该使用.sh
扩展,因为它比更流行并且更短.bash
。
答案2
您可能应该使用并使这些文件可执行,chmod +x filename
并在第一行(shebang)中指定脚本解释器:
#!/bin/bash
或者,尊重$PATH
:
#!/usr/bin/env bash
这样,文件本身就指定了要使用的脚本解释器。您甚至可以bash
为此指定参数。如果您需要将配置应用于脚本中的登录 shell,则可以执行以下操作:
#!/bin/bash --login
使用自定义文件扩展名(例如).bash
可能会破坏不明显的进程,例如如果您还使用 Windows 系统,则 FTP 文件传输:许多 FTP 程序将具有特定扩展名的文件视为文本,从而更改行尾。如果您对脚本使用非标准文件扩展名,则不会发生这种情况,并且\r
将保留 Windows 中的(回车)字符。
重命名为.command
可能不起作用,因为您的工作目录随文件执行方式而改变。它将始终在 中执行$HOME
,例如/Users/danielbeck
,并且相对路径需要从那里开始。提供绝对路径更安全。
如果你不需要终端窗口来执行程序,你也可以使用自动机和它的运行 Shell 脚本创建应用程序或服务的操作,后者可以使用可选的键盘快捷键系统偏好设置 » 键盘 » 键盘快捷键 » 服务。
您需要配置服务才能接收任何应用程序中的文件和文件夹作为输入,并在选择文件时执行它;如果它是一个应用程序,您可以将文件拖放到它上面。无论如何,配置运行 Shell 脚本接收输入的动作作为参数。
答案3
可执行 shell 脚本的第一行应该是“舍邦“;该#!
序列是一个“神奇数字”,它告诉系统该行的其余部分指定了一个解释器,它将向该解释器传递脚本的名称。
例如,如果您有一个名为“foo”(不需要后缀)的文件,如下所示:
#!/bin/sh
echo This is foo
并且你已经运行了chmod +x foo
(这很重要!),那么这个:
./foo
相当于这样:
/bin/sh ./foo
并将产生输出This is foo
。
例如,如果您想强调它是 shell 脚本,则可以将其命名为foo.sh
,但这不是必需的。(通常,用户没有理由关心它是如何实现的;在这种情况下,您可以直接将其命名为foo
,它可以是 shell 脚本、Perl 或 Python 脚本或已编译的可执行文件。)
#!/bin/sh
那么和之间有什么区别呢#!/bin/bash
?在大多数情况下,它们是可以互换的。 /bin/sh
通常是 Bourne Shell,它可以追溯到 Unix 的早期;您可以在所有类 Unix 系统上找到它的版本,包括 Linux 和 MacOS。 /bin/bash
是 GNU“Bourne-Again Shell”,它包括标准 Bourne shell 功能以及许多扩展。
如果您仅使用 Bourne shell 支持的功能,那么最好#!/bin/sh
仅将其作为风格问题来使用,这样您的脚本就更有可能在其他系统(可能未安装 Bash)上无需更改即可运行。
如果您使用 Bash 特定功能,则需要使用#!/bin/bash
。