Bash
使 bash dos-eol 具有容錯性
當我想編譯一些 Linux 核心時會發生這種情況,但最終會得到這樣的消息:
.../kernel-source/scripts/mkmakefile: line 5: $'\r': command not found
那是因為該文件是 DOS-EOL 而不是正常的。我通常可以用 . 修補那些有問題的文件
dos2unix
,但在這種情況下,該mkmakefile
文件是由其他一些腳本生成的(使用 Yocto Linux 框架,但我在 Android 建構過程中遇到了同樣的問題)。我知道 CygWin 有一個
igncr
bash 選項,但在 Linux bash 上沒有。有沒有辦法/選項告訴 bash 只是忽略
\r
字元(即\r\n
等效於\n
)?編輯:錯誤出現在 shebang 和第一個可執行行之間的第一個空白行(註釋之間的空白行)。
Yocto 日誌(實際上是 Petalinux,Xilinx 的基於 Yocto 的框架)顯示:
DEBUG: Executing python function sysroot_cleansstate DEBUG: Python function sysroot_cleansstate finished DEBUG: Executing python function check_oldest_kernel DEBUG: Python function check_oldest_kernel finished DEBUG: Executing shell function do_configure NOTE: make HOSTCC=gcc HOSTCPP=gcc -E -C .../project/build/tmp/work-shared/plnx_arm/kernel-source O=.../project/build/tmp/work/plnx_arm-xilinx-linux-gnueabi/linux-xlnx/4.9-xilinx-v2017.4+gitAUTOINC+b450e900fd-r0/linux-plnx_arm-standard-build oldnoconfig NOTE: make HOSTCC=gcc HOSTCPP=gcc -E -C .../project/build/tmp/work-shared/plnx_arm/kernel-source O=.../project/build/tmp/work/plnx_arm-xilinx-linux-gnueabi/linux-xlnx/4.9-xilinx-v2017.4+gitAUTOINC+b450e900fd-r0/linux-plnx_arm-standard-build oldconfig ERROR: oe_runmake failed make: Entering directory '.../project/build/tmp/work-shared/plnx_arm/kernel-source' make[1]: Entering directory '.../project/build/tmp/work/plnx_arm-xilinx-linux-gnueabi/linux-xlnx/4.9-xilinx-v2017.4+gitAUTOINC+b450e900fd-r0/linux-plnx_arm-standard-build' .../project/build/tmp/work-shared/plnx_arm/kernel-source/scripts/mkmakefile: line 5: $'\r': command not found .../project/build/tmp/work-shared/plnx_arm/kernel-source/scripts/mkmakefile: line 11: $'\r': command not found .../project/build/tmp/work-shared/plnx_arm/kernel-source/scripts/mkmakefile: line 12: $'\r': command not found .../project/build/tmp/work-shared/plnx_arm/kernel-source/scripts/mkmakefile: line 52: warning: here-document at line 24 delimited by end-of-file (wanted `EOF') .../project/build/tmp/work-shared/plnx_arm/kernel-source/scripts/mkmakefile: line 53: syntax error: unexpected end of file make[1]: *** [.../project/build/tmp/work-shared/plnx_arm/kernel-source/Makefile:461: outputmakefile] Error 2 make[1]: Leaving directory '.../project/build/tmp/work/plnx_arm-xilinx-linux-gnueabi/linux-xlnx/4.9-xilinx-v2017.4+gitAUTOINC+b450e900fd-r0/linux-plnx_arm-standard-build' make: *** [Makefile:150: sub-make] Error 2
第 53 行是單個
EOF
標記,沒有任何換行符(來自cat << EOF > Makefile
)我猜生成腳本的最後一行是
EOF^M
,它與預期不匹配EOF
(沒有\r
/^M
)。
不,沒有辦法/選項告訴 bash 忽略
\r
字元(即\r\n
等效於\n
)。文件可以以任一文件結尾儲存在文件系統中,而 bash 對此沒有任何問題。
問題的根源似乎是由建構過程內部使用的 git 引起的。在 Linux 下,確保將其設置
autocrlf
為input
:git config --global core.autocrlf input
之後建構工作正常。