Преобразование сценариев оболочки в командные файлы довольно утомительно. Есть ли способ автоматически и легко выполнить преобразование .sh в .bat или наоборот?

1 ответ1

5

Я серьезно сомневаюсь в этом. Именно потому, что это утомительно, или, точнее, потому, что это утомительно: системы, не говоря уже о программном обеспечении, совершенно разные.

Это не просто вопрос добавления или удаления #! линия наверху. Возьмите эту строку из сценария оболочки, который я написал:

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

(Да, возможно, есть более эффективный способ сделать это, чем несколько каналов, но это не относится к делу; рассматриваемый сценарий не требует первоклассной производительности.) Это присваивание переменных, раскрытие выражений подоболочки, вызов команд путем раскрытия переменных среды, расширение переменных среды, конвейерная обработка, grep , tail и cut все объединено в один оператор. Чтобы точно преобразовать даже это одно утверждение, вам нужно знать, как все это работает, и точную семантику различных опций для вызываемых стандартных утилит, и как воссоздать такое поведение в целевой системе.

Предположим, что в обеих системах установлены утилиты 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

Это сложный пример , поскольку --button управляемого параметр обеспечивается бэкэндом, не scanimage (SANE) сам по себе. Таким образом, инструмент для преобразования этого однострочного должен был бы знать о каждой опции, предоставляемой каждым бэкэндом SANE и их аналогами в целевой системе; явно неосуществимо и, возможно, даже невозможно.

Даже действительно простой сценарий оболочки, который перебирает только набор файлов, вряд ли можно будет конвертировать автоматически. И таких простых сценариев мало и далеко между.

Кроме того, "сценарии оболочки" не являются чем-то однородным: то, что необходимо для преобразования сценария оболочки bash, отличается от того, что необходимо для преобразования сценария оболочки zsh, отличается от того, что необходимо для преобразования сценария оболочки, написанного на Perl. Во многих случаях могут даже не существовать прямые аналоги различных синтаксисов, что еще больше усложняет перевод.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .