我在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)
谢谢你们!
答案 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中执行。
你可以通过几种方式做到这一点,但最值得推荐的两个方法是
在脚本的开头添加一个shebang行。假设您要使用bash
运行它,请执行#!/bin/bash
或任何bash解释器的路径。
这个shebang系列实际上并没有被POSIX完全标准化,所以像OSX这样的BSD派生系统会愉快地处理shebanged可执行文件的多个参数,而Linux系统最多只传递一个参数。
尽管如此,shebang是一种简单易懂的方式来记录应该用于执行脚本的内容,因此它是一个很好的解决方案。
使用shell作为解释器显式调用脚本,如bash myscript.sh
或tcsh myscript.sh
甚至sh myscript.sh
这与使用shebang线并不矛盾,并且使用两者是常见的做法。
我相信OSX上的默认shell总是bash,所以你应该先尝试一下。
如果这些说明没有帮助,那么您必须深入挖掘,以找出调用上下文与脚本内部之间PATH
被改变的原因或方式上下文。
最终,这几乎肯定是您问题的根源。