在 Linux Alpine 3.11 上找不到 $PATH 中的 SH 脚本

ali*_*s51 6 linux path shell-script alpine-linux

我使用 Alpine Linux 3.11 作为新的 Docker 容器。

我有默认$PATH变量,内容如下:

echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)

当我放置一个脚本wait-for(以 开头的shell脚本#!/bin/sh)时,/usr/local/bin它显示正常:

chmod +x wait-for
mv wait-for /usr/local/bin/wait-for
ls -l /usr/local/bin/wait-for
Run Code Online (Sandbox Code Playgroud)

产生:

-rwxr-xr-x    1 root     root          1451 May  1 16:09 /usr/local/bin/wait-for
Run Code Online (Sandbox Code Playgroud)

它也在我使用时运行 sh /usr/local/bin/wait-for用来执行它。

但是,当我进入/usr/src/并尝试跑步时,wait-for我得到了sh: wait-for: not found

我的理解是因为/usr/local/bin目录在$PATH位于该目录中,所以应该全局调用任何脚本。

我误解了什么?

/usr/src/如果我使用sh /usr/local/bin/wait-for,我可以运行文件,但如果我使用/usr/local/bin/wait-for(不带sh前缀),则不能运行,它返回sh: /usr/local/bin/wait-for: not found.

的输出/etc/fstab是:

/dev/cdrom      /media/cdrom    iso9660 noauto,ro 0 0                          
/dev/usbdisk    /media/usb      vfat    noauto,ro 0 0  
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 15

您的交互式 shell 是dash(伪装为sh)。该dash壳说

sh: /usr/local/bin/wait-for: not found
Run Code Online (Sandbox Code Playgroud)

当它试图执行一个有错误的#!-line 指向一个无法找到的解释器的脚本时。这恰好与找不到您键入的命令时遇到的错误完全相同,因此很容易认为这是一个$PATH问题(在这种情况下并非如此)。其他 shell 有更多信息丰富的错误消息(bashzsh说“错误的解释器:没有这样的文件或目录”,并告诉你它试图执行的解释器)。

由于文件是 DOS 文本文件#!-line 指示 shell 运行脚本/bin/sh\r,其中\r是回车符的常见表示,它是 DOS 文本文件中行终止的一部分。在 Unix 系统上,回车是一个“普通字符”,根本不是行终止的一部分,这意味着它试图开始/bin/sh\r运行您的脚本,然后由于该文件不存在而失败。因此,它是解释器,“未找到”的是,而不是脚本本身。

使用显式解释器运行脚本会绕过#!总是会-line,这就是为什么在执行此操作时不会出现错误的原因。但是,脚本中的每一行的末尾仍然会有回车,这可能会导致脚本在某些情况下出现故障。

只需将文件重新保存为 Unix 文本文件,或使用 将其转换dos2unix,即可解决您的问题。


归档时间:

查看次数:

4025 次

最近记录:

6 年 前