我正在使用Alpine Linux 3.11作为新的Docker容器。
我有默认$PATH
变量,其内容为:
echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
当我放置一个脚本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
产生:
-rwxr-xr-x 1 root root 1451 May 1 16:09 /usr/local/bin/wait-for
当我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
您的交互式外壳为dash
(伪装为sh
)。该dash
壳说
sh: /usr/local/bin/wait-for: not found
当它尝试执行脚本时,该脚本的错误行#!
指向找不到的解释器。当找不到您键入的命令时,它恰好与您将得到的错误完全相同,因此很容易认为这是一个$PATH
问题(在这种情况下不存在)。Oher外壳程序提供了更多有用的错误消息(bash
并zsh
指出“错误的解释器:没有这样的文件或目录”,并且还告诉您它尝试执行什么解释器)。
由于该文件是DOS文本文件,因此#!
-line指示shell使用来运行脚本/bin/sh\r
,其中,\r
是回车符的通用表示形式,它是DOS文本文件中行终止的一部分。在Unix系统上,回车符是“普通字符”,而不是行终止符的所有部分,这意味着它试图开始/bin/sh\r
运行脚本,然后由于该文件不存在而失败。因此,是“找不到”的解释器,而不是脚本本身。
使用显式解释器运行脚本#!
总是绕过-line,这就是为什么这样做时不会出现错误的原因。但是,脚本中的每一行仍将在其末尾有回车符,这可能会导致脚本在某些情况下发生故障。
只需将文件重新保存为Unix文本文件,或将其转换为dos2unix
,即可解决您的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句