奇怪的^M$錯誤
本文發佈於4023天前,文中的資訊可能已有所發展或是改變,請謹慎使用!
編寫shell腳本時,我們經常習慣在windows下寫好,然後通過共用目錄拷到linux下,方便快捷。
杯具的事也來了,當我們在windows寫一個shell程式拷到linux中,修改好許可權,正準備試下效果時,
/bin/bash^M: 壞的解釋器: 沒有那個檔或目錄
什麼情況?
這跟系統有關。腳本檔在windows下編輯過,windows下每一行的結尾是\n\r
,而在linux下檔的結尾是\n
,那麼你在windows下編輯過的檔在linux下打開看的時候每一行的結尾就會多出來一個字元\r
,
用cat -A filename
時你可以看到這個\r
字元被顯示為^M
#!/bin/sh^M$
^M$
/usr/sbin/logrotate /etc/logrotate.conf^M$
EXITVALUE=$?^M$
if [ $EXITVALUE != 0 ]; then^M$
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"^M$
fi^M$
exit 0^M$
PS:cat -A
什麼意思?
A就是all的意思,就是所有的都顯示出現,也就是說\n\r
默認是不顯示的。
這時候只需要刪除這個字元就可以了。
怎麼刪掉呢?
正則運算式sed -i 's/\r$//'filename
什麼意思呢?-i
插入s
替代模式\r$
表示任何以\r
結束的字元
整句意思是把以\r
結束的字元換成空白
現在再運行就沒這個問題了。