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 有更多信息丰富的错误消息(bash并zsh说“错误的解释器:没有这样的文件或目录”,并告诉你它试图执行的解释器)。
由于文件是 DOS 文本文件,#!-line 指示 shell 运行脚本/bin/sh\r,其中\r是回车符的常见表示,它是 DOS 文本文件中行终止的一部分。在 Unix 系统上,回车是一个“普通字符”,根本不是行终止的一部分,这意味着它试图开始/bin/sh\r运行您的脚本,然后由于该文件不存在而失败。因此,它是解释器,“未找到”的是,而不是脚本本身。
使用显式解释器运行脚本会绕过#!总是会-line,这就是为什么在执行此操作时不会出现错误的原因。但是,脚本中的每一行的末尾仍然会有回车,这可能会导致脚本在某些情况下出现故障。
只需将文件重新保存为 Unix 文本文件,或使用 将其转换dos2unix,即可解决您的问题。
| 归档时间: |
|
| 查看次数: |
4025 次 |
| 最近记录: |