Скрипт, который работает и в Linux, и в Windows

Когда вы работаете с компьютерами под разными операционными системами, и Linux, и Windows, то скорее всего у вас есть какие-то схожие задачи, которые вы выполняете и в той, и в той операционной системе. И для каждой системы вы, возможно, пишете отдельные скрипты. Или, может быть, вы пишете программы на Java, и потом для каждой операционной системы пишете отдельный sh-скрипт или cmd-скрипт. В общем, если вам надо запускать скрипты для одной задачи как в Windows, так и в Linux, то вы можете написать один скрипт, который будет работать в любой из этих двух операционных систем. Мой пример работает одинаково и в Windows 7, и в Debian 7. Скрипт, безусловно, не идеальный, но как пример кроссплатформенного скрипта отлично подходит.

Сам принцип работы кроссплатформенного скрипта должен быть основан на разном использовании одинаковых скриптовых элементов. Я выбрал для этого оператор goto, который используется в пакетных файлах Windows - .bat и .cmd. В bash, к примеру, такого оператора нет, что позволит нам в скрипте для Linux написать его замену. Задача скрипта у нас будет простая - вывести название операционной системы, в которой он запущен.

Как вы знаете, первой строчкой скрипта в linux стоит обычно указание на интерпретатор, который будет использоваться. Нам придется упустить эту строчку, и предоставить выполнение текущей оболочке, из которой скрипт запускается. Давайте просто запомним, что это из хороших побуждений.

В первую очередь нам необходимо выключить вывод запускаемых команд. По умолчанию в Windows режим вывода команд включен, а в linux наоборот выключен. Поэтому первой строчкой нашего скрипта будет

echo off

Возможно, не лучший вариант, поскольку в Linux будет выведено слово “off”, но другого такого же короткого варианта, который работал бы в обеих системах, я не придумал.

Следующее, что надо сделать - написать функцию goto, которая будет выполняться при запуске в Linux.

goto(){
# Linux code here
uname -o
}

С точки зрения linux (если точнее, то bash) - это функция, с точки зрения Windows (или cmd) - это команда goto с указанием перейти на метку “(){“. Это очень важный момент. Идем дальше.

Функция у нас уже есть, теперь надо ее вызвать.

goto $@
exit

В данном случае мы с точки зрения bash вызываем функцию goto и передаем ей список параметров, которые были заданы в командной строке при запуске скрипта. После этого вызова мы просто выходим из скрипта. Когда мы запускаем скрипт, то основное тело скрипта для Linux - это тело функции goto().

Ну, а теперь осталось сделать запуск скрипта в Windows. Это даже еще проще. Пишем после строчки со словом exit следующее:

:(){
rem Windows script here
echo %OS%

Строчка с символами “:(){“ - это метка, на которую мы попадем, когда запустим скрипт в Windows. Всё, что будет стоять после этой строчки и до конца файла, будет телом скрипта, выполняющегося в Windows.

Вот, собственно и всё. Мы получили скрипт, работающий как в Linux, так и в Windows, к тому же без ошибок. Единственный минус в данном случае - вывод слова “off” в Linux, но с этим, я думаю, можно смириться.

Ну и, собственно, всё тело скрипта:

echo off

goto(){
# Linux code here
uname -o
}

goto $@
exit

:(){
rem Windows script here
echo %OS%
exit

Весь полученный код (чуть больше 100 байт) надо теперь записать в файл с окончанием .cmd, чтобы он мог запускаться в Windows. А для запуска в Linux надо просто добавить права на выполнение:

chmod a+x ./myscript.cmd

Вот и всё. Если у вас есть свои варианты кросплатформенных скриптов, буду рад, если напишете в комментариях.

Licensed under GPL v2

Repo link: https://github.com/mnorin/mnorin.github.io