Скрипт, который работает и в 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

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

[wysija_form id=»2″]