make
当我尝试使用 LiveCD SVN Trunk启动 LFS 进程时,遇到奇怪的错误。当我去跑步时,make
它给了我;
$ make
/bin/sh: 1: [: -ne: unexpected operator
-e Missing gawk on host!
Please install gawk and re-run 'make'.
make: *** [test-host] Error 1
version-check.sh
但我已经安装了 gawk,当我运行脚本时我可以看到这一点。
bash, version 4.3.11(1)-release
/bin/sh -> /bin/dash
Binutils: (GNU Binutils for Ubuntu) 2.24
bison++ Version 1.21.9-1, adapted from GNU bison by [email protected]
/usr/bin/yacc -> /usr/bin/bison++.yacc
bzip2, Version 1.0.6, 6-Sept-2010.
Coreutils: 8.21
diff (GNU diffutils) 3.3
find (GNU findutils) 4.4.2
GNU Awk 4.0.1
/usr/bin/awk -> /usr/bin/gawk
gcc (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
g++ (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
(Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19
grep (GNU grep) 2.16
gzip 1.6
Linux version 3.13.0-37-generic (buildd@kapok) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #64-Ubuntu SMP Mon Sep 22 21:28:38 UTC 2014
m4 (GNU M4) 1.4.17
GNU Make 3.81
GNU patch 2.7.1
Perl version='5.18.2';
sed (GNU sed) 4.2.2
tar (GNU tar) 1.27.1
xz (XZ Utils) 5.1.0alpha
g++ compilation OK
libgmp.la: not found
libmpfr.la: not found
libmpc.la: not found
即使在我的路径目录中,我也看到它gawk
确实已安装。
$ ls -la /usr/bin | grep awk
lrwxrwxrwx 1 root root 21 Mar 4 17:36 awk -> /etc/alternatives/awk
-rwxr-xr-x 1 root root 538224 Jul 3 2013 dgawk
-rwxr-xr-x 1 root root 950 Mar 16 2012 dpkg-awk
-rwxr-xr-x 1 root root 441512 Jul 3 2013 gawk
-rwxr-xr-x 1 root root 3188 Jul 3 2013 igawk
-rwxr-xr-x 1 root root 117768 Mar 24 2014 mawk
lrwxrwxrwx 1 root root 22 Mar 4 17:36 nawk -> /etc/alternatives/nawk
-rwxr-xr-x 1 root root 445608 Jul 3 2013 pgawk
我不明白为什么它声称它安装时没有安装。为什么会发生这种情况?
答案1
看来这段代码是问题所在:
test-host: @if [ $$EUID -ne 0 ] ; then \ echo "You must be logged in as root." && exit 1 ; fi @if ! type -p gawk >/dev/null 2>&1 ; then \ echo -e "Missing gawk on host!\nPlease install gawk and re-run 'make'." && exit 1 ; fi
当执行第一个命令时,未设置if …
变量,因此执行命令,但这对于实用程序来说不是有效的语法。当执行第二个时,该命令被执行,即使确实存在,它也会返回失败状态,表明未正确设置或该命令不支持该选项。 (剧透:是后者。)错误消息在开头,表明无法识别为选项。EUID
[ -ne 0 ]
[
if …
type -p gawk
gawk
PATH
type
-p
-e
echo
-e
该 makefile 依赖于 bash 功能:EUID
,echo -e
是type -p
bash 功能。您的系统sh
是 dash,而不是 bash(dash 是 Debian 上的默认设置,并check-version.sh
确认它/bin/sh
是 dash)。 Dash 是一个比 bash 更精简、更快的 shell;它并没有比 POSIX 要求的更多,而且不包括EUID
or type -p
。我还没有查看 makefile,但可能还有更多地方需要 bash。
由于 makefile 需要 bash,因此它应该包含一行以SHELL = bash
.如果没有这样一行,请告诉 make 使用 bash 作为所有命令的 shell:
make SHELL=/bin/bash