"未找到命令"在shell脚本中

时间:2014-09-03 08:39:38

标签: bash

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

谢谢你们!

2 个答案:

答案 0 :(得分:1)

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

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

matlab

答案 1 :(得分:0)

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

当使用命令名称时,例如" matlab",你的shell按顺序查看PATH中的每个目录,搜索包含名称为&#34的可执行文件的目录; 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派生系统会愉快地处理shebanged可执行文件的多个参数,而Linux系统最多只传递一个参数。 尽管如此,shebang是一种简单易懂的方式来记录应该用于执行脚本的内容,因此它是一个很好的解决方案。

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


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