作为一个个人项目,我正在尝试编写一个脚本来清理在 Cygwin 下运行的 Windows 10 附带的一些无关文件。我希望脚本能够复制和粘贴,这要求它能够抵抗不同类型的换行符。是否有任何类似 shell可以在设置某些选项时sh
暴露出将空格视为空白的能力?\r
这是一件奇怪的事情。答案可能归结为“是的,这是一件奇怪的事情,而且没有办法做到”。
答案1
一般来说,这对于实际脚本来说是不可能的。
独立的可执行脚本将有一个 shebang 行,用于标识要使用的解释器:
#!/bin/sh
问题是,无论翻译如何,舍邦线本身将在末尾之前包含一个回车符,这意味着将找不到解释器(除非字面上不太可能的可执行名称
$'sh\r'
- 我认为这在 Windows 上是非法的)。另一种可执行脚本是带有执行位设置的纯文本文件,它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 行中的回车符,然后您可以使用注释来完成其余部分。