从make调用的/ bin / sh找不到带有不带引号的dash-argument的命令

时间:2009-11-19 16:28:03

标签: bash shell makefile

我有一个makefile来使用Xerox的有限状态工具(在本例中为xfst)构建一些传感器,我在我的makefile中调用它(当然,除了在实际的makefile中使用硬标签而不是空格):

latin.fst: nouns.fst verbs.fst
    xfst -f build/latin.fst.build

在我的笔记本电脑(运行OS X 10.6.2的Mac)上运行正常,但在我大学的Linux机器上我收到此错误:

make: xfst: Command not found
make: *** [nouns.fst] Error 127

经过一些调试后,我找到了两种方法来解决这个问题。第一个是将-f参数引用到xfst:"-f",另一个是在makefile的顶部引用SHELL=/bin/bash

从第二个修复(以及make如何工作)看起来问题是/ bin / sh如何执行命令。现在,/ bin / sh链接到/ bin / bash,所以这不是因为某种奇怪的shell被安装为/ bin / sh。此外,调用/ bin / sh并运行命令,或调用/bin/sh -c "xfst -f build/latin.fst.build"只是花花公子。

Make是GNU Make 3.81,bash是GNU bash,版本3.2.25(1)-release。

有谁知道这里发生了什么?

3 个答案:

答案 0 :(得分:2)

这是一个奇怪的错误,我不知道是什么导致它,但这是我尝试的:

.PHONY: experiment
experiment:
    @echo make's SHELL variable: $(SHELL)
    @echo the actual shell: $$SHELL
    which xfst

修改:
等一下......错误信息显示在尝试制作nouns.fst时失败,而不是latin.fst。是对的吗? (如果是的话,那么这个问题就更奇怪了。)

修改:
好吧,现在我抓着稻草。我扩大了搜索范围,尝试运行其他带有选项的程序,尝试别名“xfst -f”,尝试创建一个到xfst的本地符号链接,尝试用引号或反引号括起整个命令......然后只是承认我完全被难住了。

答案 1 :(得分:0)

也许您修改了bash特定的启动文件(.bashrc.bash_profile)来更改Linux计算机上的$PATH以包含xfst所在的目录} 位于。在这种情况下,在/bin/sh下运行不会调用.bash*,因此正确的目录不会在您的路径上。

答案 2 :(得分:0)

无论何时在使用不同行结尾的系统之间移动,最好还是检查这是否是您遇到的问题的罪魁祸首。我相信你知道,Linux和Unix使用0x0a,DOS和Windows使用0x0d 0x0a,Mac使用0x0d。尝试查看该文件 hd filename查看您拥有的样式行结尾(它们甚至可能在文件中有所不同)。