“sh 命令”和作为可执行文件运行有什么区别?

“sh 命令”和作为可执行文件运行有什么区别?

我使用了 @Artem S. Tashkinov 建议的脚本:”我为自己编写了这个,但它在控制台上运行。

请参阅此处的相关帖子

$sh raw_io.sh: 
20: shopt: not found 
raw_io.sh: 
48: declare: not found 
raw_io.sh: 
61: Syntax error: redirection unexpected

我发现我只需使其可执行并双击它,然后“在终端中运行”:

由于它令人耳目一新,我无法复制/粘贴输出。所以我做了一个截图: 输出 在终端运行

由于它可以通过双击运行,但我需要单击“在终端中运行”,我还想知道如何直接从终端启动它。

~/Desktop$ raw_io
raw_iso: command not found

那么这些启动方式有什么区别呢?

答案1

如何执行名为 的脚本myscript

sh myscript        # Or sh /path/to/myscript
bash myscript      # Or bash /path/to/myscript
perl myscript      # Or perl /path/to/myscript
python myscript    # Or python /path/to/myscript

ETC。

这很简单,但您确实需要知道使用哪个解释器来运行脚本,并且您已经注意到尝试使用错误的解释器会生成错误(例如使用sh而不是bash)。

更好的是让脚本自己声明正确的解释器。这是使用#!第一行的 定义的。例如,这一行将声明bash(特别是/bin/bash)作为解释器:

#!/bin/bash

要使用此功能,您需要使脚本可执行,

chmod a+x myscript

然后,只要它位于指定的冒号分隔目录列表之一中,$PATH您就可以像任何其他程序一样运行它 - 只需使用它的名称

myscript

但是,请注意,当前目录(标记为.)不在其中$PATH,因此如果您正在当前目录中处理脚本,则需要提供脚本的路径以便可以找到它。这里.代表的是当前目录它是相对于当前工作目录的路径(即同一位置):

./myscript    # Or /full/path/to/myscript

有充分的理由为什么.通常不在 中$PATH,但如果必须添加它,请将其放在末尾$PATH而不是开头。 (看UNIX 的历史记录不包括 $PATH 中的当前目录为什么是 。默认不在路径中?.)

请注意,脚本名称或扩展名并不重要(除非您最终使用的命令名称test已经存在于 中列出的系统目录中$PATH)。我myscript在这里用作示例。如果您愿意,您可以使用myscript.sh,甚至可以使用confusion.png,但您不使用,ls.exe所以我认为没有必要使用myscript.sh。但请注意,某些 GUI 可能会使用文件扩展名来猜测文件中的内容,并且以非标准方式(例如png脚本)使用扩展名可能会使它们感到困惑。 GUI 识别文件内容的正确方法是使用与该命令等效的命令file,但并非所有方法都这样做:

file myscript

最后,当我完成一个脚本的工作后,我将重用它,我倾向于将其放入我的$PATH.然后它就成为像ls或一样易于访问的工具cp。就我而言,我使用$HOME/bin但您可以选择任何您喜欢的目录,只要它在$PATH.

相关内容