Bash

使 bash dos-eol 具有容錯性

  • April 11, 2018

當我想編譯一些 Linux 核心時會發生這種情況,但最終會得到這樣的消息:

.../kernel-source/scripts/mkmakefile: line 5: $'\r': command not found

那是因為該文件是 DOS-EOL 而不是正常的。我通常可以用 . 修補那些有問題的文件dos2unix,但在這種情況下,該mkmakefile文件是由其他一些腳本生成的(使用 Yocto Linux 框架,但我在 Android 建構過程中遇到了同樣的問題)。

我知道 CygWin 有一個igncrbash 選項,但在 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 下,確保將其設置autocrlfinput

git config --global core.autocrlf input

之後建構工作正常。

引用自:https://unix.stackexchange.com/questions/436755