繁体   English   中英

shell脚本中的“找不到命令”

[英]"Command not found" inside shell script

我在 mac (OSX 10.9) 上有一个名为 msii810161816_TMP_CMD 的 shell 脚本,内容如下。

matlab

当我执行它时,我得到

./msii810161816_TMP_CMD: line 1: matlab: command not found

但是,当我直接在 shell 中键入 matlab 时,它会正常启动。 同一个命令如何在 shell 中工作,但在 shell 脚本中却不起作用? 我将命令直接从脚本复制粘贴到 shell 中,它起作用了......

PS:当我用

echo matlab

我得到了想要的结果,所以我绝对可以执行 shell 脚本(我使用 ./msii810161816_TMP_CMD)

谢谢你们!

默认情况下,别名不会在非交互式 shell 中展开,这就是 shell 脚本。 别名旨在供键盘上的人用作打字辅助。

如果您的目标是不必输入matlab的完整路径,那么您应该修改您的$PATH而不是创建别名。 /Applications/MATLAB_R2014a.app/bin添加到您的$PATH环境变量中,然后您和您的 shell 脚本都可以简单地说

matlab

这是因为,正如评论者所说,执行脚本的 shell 内的PATH变量不包括包含matlab可执行文件的目录。

当使用命令名称时,例如“matlab”,您的 shell 按顺序查看PATH中的每个目录,搜索包含名称为“matlab”的可执行文件的目录。


无需赘述, PATH由被调用的 shell 确定。 当您执行bash ,它会将必须位于PATH中的基本目录的全局设置与您的~/.bashrc中更改PATH任何设置相结合。

很可能,您没有在PATH包含matlab目录的 shell 中运行脚本。 要验证这一点,您可以执行以下步骤:

  • 运行which matlab 这将向您显示 matlab 可执行文件的路径。
  • 运行echo "$PATH" 这将显示您当前的PATH设置。 请注意, which matlab所在的目录包含在以冒号分隔的列表中。
  • 在脚本的开头添加一行echo "$PATH" 请注意,不包含which matlab的目录。

要解决此问题,请确保您的脚本在PATH中具有所需目录的 shell 中执行。 您可以通过几种方式做到这一点,但最强烈推荐的两种方法是

  1. 在脚本的开头添加一个 shebang 行。 假设您想使用bash运行它,请执行#!/bin/bash或您的 bash 解释器的任何路径。 shebang 行实际上并没有被 POSIX 完全标准化,所以像 OSX 这样的 BSD 派生系统会很乐意处理 shebang 可执行文件的多个参数,而 Linux 系统最多传递一个参数。 尽管如此,shebang 是一种简单而简单的方式来记录应该用于执行脚本的内容,因此它是一个很好的解决方案。

  2. 使用 shell 作为解释器显式调用您的脚本,如bash myscript.shtcsh myscript.sh甚至sh myscript.sh这与使用 shebang 行不兼容,并且使用两者是一种常见做法。 我相信 OSX 上的默认 shell 总是 bash,所以你应该从尝试开始。


如果这些说明没有帮助,那么您必须深入挖掘以找出在调用上下文和脚本的内部上下文之间更改PATH原因或方式。 最终,这几乎可以肯定是您问题的根源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM