Когда вы работаете с компьютерами под разными операционными системами, и 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″]