bash/zsh 脚本不会从 FreeBsd 中的终端调用,无论是在 bash 中还是在 zsh 中

bash/zsh 脚本不会从 FreeBsd 中的终端调用,无论是在 bash 中还是在 zsh 中

我在 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

相关内容