关于执行shell脚本

DBS*_*DBS 2 shell path executable shell-script

假设我有一个 shell 脚本文件foo.sh

我可以这样做chmod + x foo.sh 并将其更改为可执行文件。

在 Kernighan-Pike: Unix Programming Environment (UP) 中,他们表明在输入之后foo应该执行脚本。相反,在我的 Ubuntu 系统中,我需要输入sh foo./foo。我猜这是由于 shell 的某些功能早先不存在(在编写 UP 时)。如果有人能启发我为什么存在这种差异以及为什么它很重要,我将不胜感激?

Joh*_*024 5

  1. 可执行文件的名称很重要。如果您的文件名为foo.sh,则foo除非有其他名为foo. 与 Windows 不同,Unix 不进行隐式文件扩展。

  2. 如果以下有效:

    ./foo.sh
    
    Run Code Online (Sandbox Code Playgroud)

    但这不会:

    foo.sh
    
    Run Code Online (Sandbox Code Playgroud)

    这意味着该文件在您的当前目录中,而您的当前目录不在您的 PATH 中。为了您的保护,如果您没有明确提供命令的路径,shell 将只在您的 PATH 中的文件中查找该命令。

  3. 空间很重要。以下可能有效:

    ./foo.sh
    
    Run Code Online (Sandbox Code Playgroud)

    但是,这(取自本问题的第一个版本)肯定行不通:

    ./ foo.sh
    
    Run Code Online (Sandbox Code Playgroud)

    中间有空隙./foo.sh,外壳会认为你想执行当前目录foo.sh作为参数。这将生成错误消息。

  • @戈登;如果在“PATH”序列的开头有“.”,则“PATH”中的“.”问题被特别认为是不好的。如果你在 `PATH` 的末尾有 `.`,那么系统命令(比如你的 `ls` 示例)将总是在 `.`(当前目录)中的可执行文件之前找到(并执行)。 (2认同)