Cygwin

能夠將 r 視為空白字元的 Shell

  • December 31, 2018

作為一個個人項目,我正在嘗試編寫一個腳本來清理在 Cygwin 下執行的 Windows 10 附帶的一些無關文件。我希望腳本可以複製和粘貼,這需要它對不同類型的換行符具有強韌性。是否有任何類似sh- 的 shell 暴露了將其\r視為空格的能力,可能在設置了某些選項時?

這是一件很奇怪的事情。答案可能歸結為“是的,這是一件奇怪的事情,而且沒有辦法做到這一點”。

通常,這對於實際腳本是不可能的。

  1. 一個獨立的可執行腳本將有一個 shebang 行,用於標識要使用的解釋器:
#!/bin/sh

問題是,無論解釋器如何,shebang 行本身都將在結尾之前包含一個輸入符,這意味著找不到解釋器(除非字面上不太可能的可執行名稱$'sh\r'- 我認為這在 Windows 上是非法的) . 2. 另一種可執行腳本是設置了執行位的純文字文件,POSIX 要求將其解釋為 POSIX shell 命令語言中的腳本(當從兼容的 shell 本身呼叫時)。但是,正如您所發現的,這種 shell 語言將輸入視為數據字節,因此您遇到了已確定的問題。


你有一些選擇。一種是直接放棄一個實際的可執行腳本,而只是首先呼叫其他語言的解釋器。您已經確定了 Perl 和 Python,事實上大多數腳本語言都對任何現代行結束格式感到滿意。呼叫腳本 asperl cleanup.pl不會有問題。

然而,在傳統的 shell 語言中,許多管理任務要容易得多,而且還有一個技巧:在每一行結束時加上註釋。

echo hello #
rm file.ext #
mv /path/other.fl /path/bin #

#字元在所有標準 shell 中(在非互動式上下文中)在行尾引入註釋。註釋將包括輸入字節,這是註釋的一個很好的元素,然後立即以終止換行字節結束。

重要的是在散列之前有那個空格:#單詞內部的 a不是註釋的開頭,而是單詞的一部分

您可以使用 shell 直接執行此腳本:

bash cleanup.sh
dash cleanup.sh
sh cleanup.sh

但是,如果您要通過在現有 shell 會話中鍵入命令來啟動它,那麼前面提到的那些 POSIX 腳本也可以工作:只需使文件可執行,然後

./cleanup.sh

將使用您的 shell 認為對 POSIX 腳本執行的正確操作來執行它。

由於這聽起來像是一次性的,因此使其可執行的努力可能不值得,所以sh cleanup.sh對我來說似乎就足夠了。


我對這種情況的誠實建議可能是 Powershell(或批量推送),但我知道這不是你想要的。WSL 是另一種選擇:它會自動處理 shebang 行中的輸入,然後您可以使用註釋處理其餘部分。

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