[英]"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 中执行。 您可以通过几种方式做到这一点,但最强烈推荐的两种方法是
在脚本的开头添加一个 shebang 行。 假设您想使用bash
运行它,请执行#!/bin/bash
或您的 bash 解释器的任何路径。 shebang 行实际上并没有被 POSIX 完全标准化,所以像 OSX 这样的 BSD 派生系统会很乐意处理 shebang 可执行文件的多个参数,而 Linux 系统最多传递一个参数。 尽管如此,shebang 是一种简单而简单的方式来记录应该用于执行脚本的内容,因此它是一个很好的解决方案。
使用 shell 作为解释器显式调用您的脚本,如bash myscript.sh
或tcsh myscript.sh
甚至sh myscript.sh
这与使用 shebang 行不兼容,并且使用两者是一种常见做法。 我相信 OSX 上的默认 shell 总是 bash,所以你应该从尝试开始。
如果这些说明没有帮助,那么您必须深入挖掘以找出在调用上下文和脚本的内部上下文之间更改PATH
原因或方式。 最终,这几乎可以肯定是您问题的根源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.