能够将 `\r` 视为空白字符的 shell

能够将 `\r` 视为空白字符的 shell

作为一个个人项目,我正在尝试编写一个脚本来清理在 Cygwin 下运行的 Windows 10 附带的一些无关文件。我希望脚本能够复制和粘贴,这要求它能够抵抗不同类型的换行符。是否有任何类似 shell可以在设置某些选项时sh暴露出将空格视为空白的能力?\r

这是一件奇怪的事情。答案可能归结为“是的,这是一件奇怪的事情,而且没有办法做到”。

答案1

一般来说,这对于实际脚本来说是不可能的。

  1. 独立的可执行脚本将有一个 shebang 行,用于标识要使用的解释器:

    #!/bin/sh
    

    问题是,无论翻译如何,舍邦线本身将在末尾之前包含一个回车符,这意味着将找不到解释器(除非字面上不太可能的可执行名称$'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 行中的回车符,然后您可以使用注释来完成其余部分。

相关内容