我在 FreeBsd 11 中有一个脚本
% cat my_script.sh
#!/usr/local/bin/zsh
# [........]
它有x
属性:
-rwxr-xr-- 1 root wheel 669 Jun 14 02:45 my_script.sh
我的外壳是zsh
.当我尝试执行它时,出现错误。这与我调用它的方式有关:
% sudo ./my_script.sh var1
sudo: ./my_script.sh: command not found
% sudo my_script.sh var1
sudo: my_script.sh: command not found
% sudo source my_script.sh var1
sudo: source: command not found
怎么了?
更新:
我已将 shell 更改为 bash,重新启动,更改#!
为 bash,现在我有:
$ sudo ./my_script.sh test9
sudo: ./my_script.sh: command not found
答案1
% sudo ./my_script.sh var1 sudo: ./my_script.sh: command not found
此消息表明该文件./my_script.sh
不存在,或者它的加载程序不存在。对于脚本,加载器是中提到的可执行文件舍邦线。
检查它/usr/local/bin/zsh
是否存在并且不是损坏的符号链接。
检查文件是否确实包含#!/usr/local/bin/zsh
第一行,而不是#!/usr/local/bin/zsh
在其后面或中间包含一些空格或其他不可见的字符。特别注意的是回车是会破坏事物的隐形角色之一。如果您在 Windows 下创建(或者编辑)脚本,您最终会得到 CR;如果您在 Windows 下编辑脚本,请确保保存它们时将行结尾设置为“LF”或“Unix”或“Linux”或您的编辑器的任何名称。
% sudo my_script.sh var1 sudo: my_script.sh: command not found
这个不起作用的原因很简单:myscript.sh
不在命令搜索路径。
% sudo source my_script.sh var1 sudo: source: command not found
这个不起作用的原因很简单:source
它是一个内置的 shell,它不是一个可执行文件。 (作为可执行文件没有任何意义,因为它的目的是执行一些 shell 代码在当前外壳中——只有 shell 才能做到这一点。)
您当前运行的 shell 与这三个命令无关。
答案2
问题是既sudo
不能保证维护您当前的目录也不能保证您的PATH
.
因此,为了确保找到脚本,请指定完整路径:
sudo /path/to/my_script.sh
也会出现相同的错误,sudo source
因为它source
是内置的 shell,而不是文件。不使用 shell,而是sudo
使用 执行其参数execev
,这需要一个文件。
有关详细信息,请参阅man sudo
(特别是工艺模型部分和-E和-s选项),有关配置选项,请参阅man sudoers
和/etc/sudoers
。
有关使用 指定脚本路径的更多选项sudo
,请参阅https://stackoverflow.com/questions/12996397/command-not-found-when-using-sudo