【问题标题】:/bin/sh invoked from make doesn't find command with unquoted dash-argument从 make 调用的 /bin/sh 找不到带有未引用的破折号参数的命令
【发布时间】:2010-12-18 09:17:48
【问题描述】:

我有一个 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。

有人知道这里发生了什么吗?

【问题讨论】:

    标签: bash shell makefile


    【解决方案1】:

    这是一个奇怪的错误,我不知道是什么原因造成的,但这是我要尝试的:

    .PHONY:实验 实验: @echo make 的 SHELL 变量:$(SHELL) @echo 实际外壳:$$SHELL 哪个 xfst

    编辑:
    稍等...错误消息显示 Make 在尝试制作 nouns.fst 而不是 latin.fst 时失败。那正确吗? (如果是,那么这个问题就变得更奇怪了。)

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

    【讨论】:

    • 好建议。这是我得到的输出(在删除使 sh cry = 的属格引号之后):使 SHELL 变量:/bin/sh 成为实际的 shell:/local/gnu/bin/bash which xfst /uio/arkimedes/s11/arnskj/sw /bin/xfst 调用 /local/gnu/bin/bash 作为 shell 并执行 xfst -f build/latin.fst.build 工作正常。 /local/gnu/bin/bash -c 'xfst -f build/latin.fst.build' 相同
    • 呃,对。我弄乱了make experiment 的输出格式。 $(SHELL) 是 /bin/sh,实际的 shell i /local/gnu/bin/bash,它找到了 xfst 的正确路径。
    • 哦,很抱歉这个奇怪的错误。 nouns.fst 的制作方式与 latin.fst 相同,只是使用了不同的构建文件。有几个 FST 以相同的方式构建(并且以相同的方式失败)。为简单起见,我只列出了其中一条规则,忘记提及还有更多规则。
    【解决方案2】:

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

    【讨论】:

    • 我已经自定义了我的路径。但是,如果我在有问题的命令之前添加 env 作为命令,则 PATH 确实包含我想要的所有值。另外,如果它依赖于 PATH,为什么引用 -f 参数来修复它?
    • 奇数。也许您可以在两台机器上尝试make -d,看看幕后发生了什么。
    • 不幸的是,make -d 并没有真正说明 shell 是如何调用的。基本上,它只是说“我现在要执行命令 `xfst -f build/latin.fst.build'”,但没有具体说明它是如何做到的。
    【解决方案3】:

    每当您在使用不同行尾的系统之间移动时,最好检查一下这是否是您遇到问题的罪魁祸首。我相信你知道,Linux 和 Unix 使用 0x0a,DOS 和 Windows 使用 0x0d 0x0a,Mac 使用 0x0d。尝试查看文件 hd filename 看看你有什么风格的行尾(它们甚至可能在文件中有所不同)。

    【讨论】:

    • 行尾如何解释引用可以解决问题?除了 OS X 现在是 UNIX,所以文件有 0x0a 行结尾(我检查过)。
    猜你喜欢
    • 2019-11-28
    • 2015-02-03
    • 2021-11-13
    • 2019-04-19
    • 2013-05-16
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多