Shell
為 LFS 執行 make 抱怨 [ 和缺少 gawk
當我嘗試
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
但是我已經安裝了 gawk 並且在執行
version-check.sh
腳本時可以看到這一點。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 coetmeur@icdc.fr /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
我不明白為什麼它在安裝時聲稱它沒有安裝。為什麼會這樣?
看起來這段程式碼是問題所在:
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
ortype -p
。我沒有瀏覽過makefile,但可能還有更多需要bash的地方。由於 makefile 需要 bash,它應該包含一行
SHELL = bash
. 在沒有這樣一行的情況下,告訴 make 使用 bash 作為所有命令的 shell:執行make SHELL=/bin/bash