Shell 文件 (*.sh) 到批处理文件 (*.bat) 转换器?

sta*_*ack 0 shell batch shell-script batch-file

将 shell 脚本转换为批处理文件是非常乏味的。有没有办法自动轻松地执行 .sh 到 .bat 的转换,反之亦然?

use*_*ser 5

我严重怀疑。正因为做起来太繁琐,或者更准确的说是繁琐的原因:系统,更不用说涉及的软件了,完全不同。

这不仅仅是#!在顶部添加或删除一行的问题。从我编写的 shell 脚本中获取这一行:

STREAM_FROM=$($ZFS list -t snapshot ${BACKUP_TARGET_FS} -H -o name -r | grep '@backup_' | tail -n 1 | cut -d '@' -f 2)
Run Code Online (Sandbox Code Playgroud)

(是的,可能有比少数管道更有效的方法,但这不是重点;有问题的脚本不需要一流的性能。)这是变量赋值、子shell表达式扩展、命令调用环境变量扩展、环境变量扩展、管道greptailcut 所有合并为一个语句。为了准确地转换这一条语句,您需要知道所有这些是如何工作的以及调用的标准实用程序的各种选项的确切语义,以及如何在目标系统上重新创建该行为。

假设您在两个系统上都安装了 ZFS 实用程序(因此我们不必担心那部分)。您将如何自动将其转换为 Windows 批处理文件语句或语句集?我认为除非你能做一些类似于解决停机问题的事情,否则不可能编写一个通用的转换器,比如你正在寻找的那种。与自然语言翻译不同,计算机程序的行为与原始行为“接近”只是远远不够好:任何不完美的东西都是一个错误。

或者接受我前几天做的扫描工作(诚然不是脚本,但它也可以很容易;我只是将它输入到终端中,因为它是一次性的);我最终得到了一些与以下不同的东西:

for n in $(seq 10 66); do scanimage --button-controlled=yes -x 180 -y 200 --mode Gray --format=tiff > scan${n}.tmp && convert scan${n}.tmp scan${n}.png && \rm scan${n}.tmp; done
Run Code Online (Sandbox Code Playgroud)

这是一个复杂的例子,因为 --button-controlled 选项是由后端提供的,而不是由scanimage(SANE) 本身提供的。因此,转换这种单行的工具需要了解每个 SANE 后端及其在目标系统上的对应项提供的每个选项;显然不可行,甚至不可能

即使是仅迭代一组文件的真正简单的 shell 脚本也不太可能自动转换。并且这种简单的脚本很少,而且介于两者之间。

此外,“shell 脚本”并不是同质的:转换 bash shell 脚本所需的内容不同于转换 zsh shell 脚本所需的内容,也不同于转换用 Perl 编写的 shell 脚本所需的内容。在许多情况下,甚至可能不存在各种语法的直接对应物,这进一步使翻译复杂化。