Благодаря наличию сборки A2 в виде консольного приложения (все последние сборки в репозитории так собираются по-умолчанию). Для Linux это основной вариант сборки, для Window это через указание линковщику параметра## Код:
```
--fileFormat=PE32CUI
```
Мы можем теперь на базе этого сделать простейший CGI-скрипт, например:> -- Цитата:
> System.Show Content-type: text/html~System.Ln ~System.Ln ~System.Show <HTML> ~System.Ln ~System.Show <HEAD><TITLE>Hello from A2 OS</TITLE></HEAD> ~System.Ln ~System.Show <BODY> ~System.Ln ~System.Show <H1>Hello from A2 OS!</H1> ~System.Ln ~System.Show <H2>Version information:</H2> ~System.Version ~System.Ln ~System.Show <H2>Some environment variables:</H2> ~System.Ln ~env.var HTTP_HOST ~System.Show <BR> ~System.Ln ~env.var HTTP_USER_AGENT ~System.Show <BR> ~System.Ln ~env.var REQUEST_URI ~System.Show <BR> ~System.Ln ~env.var REQUEST_METHOD ~System.Show <BR> ~System.Ln ~env.var SERVER_NAME ~System.Show <BR> ~System.Ln ~env.var SERVER_SOFTWARE ~System.Show <BR> ~System.Ln ~env.var SERVER_SIGNATURE ~System.Show <BR> ~System.Ln ~env.var UNIQUE_ID ~System.Show <BR> ~System.Ln ~System.Show <H2>Loaded modules:</H2> ~System.ListModules ~System.Ln ~System.Show <H2>To be continued... Stay tuned!</H2> ~System.Show </BODY></HTML> ~System.Ln ~System.PowerDown ~И такой результат можем увидеть в браузере (CGI включён в shtml страничку через SSI):Вложение:
A2 CGI.png [ 58.12 КБ | Просмотров: 10520 ]
env.var- это вызов простейшего модуля, реализующего процедуру чтения переменной окружения по имени:## Код:
```
MODULE env; (** AUTHOR "Yaroslav Romanchenko"; PURPOSE "Simple example of reading environment variables on Unix"; *)
IMPORT
   SYSTEM, Commands, Unix;
PROCEDURE GetEnvVar(aName: ARRAY OF CHAR; VAR aVar: ARRAY OF CHAR): BOOLEAN;
VAR
   addr: ADDRESS;
   i, max: LONGINT;
   c: CHAR;
   bOk: BOOLEAN;
BEGIN
   bOk := FALSE;
   max := LEN(aVar) - 1;
   (* For reading even one char we need at least array of length 2 *)
   IF max >= 1 THEN
      addr := Unix.getenv(ADDRESSOF(aName));
      IF addr = 0 THEN
         (* There is no such variable. Result is FALSE *)
         aVar[0] := 0X
      ELSE
         REPEAT
            SYSTEM.GET(addr, c);
            aVar[i] := c;
            INC(addr);
            INC(i)
         UNTIL (c = 0X) OR (i = max);
         aVar[i] := 0X;
         bOk := TRUE
      END
   END;
   RETURN bOk
END GetEnvVar;
PROCEDURE var*(context: Commands.Context);
VAR
   aName, aVar: ARRAY 256 OF CHAR;
BEGIN
   context.arg.SkipWhitespace();
   context.arg.Token(aName);
   IF (aName[0] # 0X) & GetEnvVar(aName, aVar) THEN
      context.out.String(aName);
      context.out.Char('=');
      context.out.String(aVar);
      context.out.Ln
   END;
END var;
END env.
```

Как организовать компиляцию исходника, предназначенного для Linux, из WinAos?
Очень просто. Сначала получаем список зависимостей, например, модуляCommands, который нам точно нужен:> -- Цитата:
> Release.RequiredModules Linux64 Commands ~Видим, что в списке зависимостей модульUnix, который нам тоже нужен, уже включён. Значит список полон. Пишем команду компиляции под нужную платформу, включая список зависимостей, модульCommands.Modи наш модульenv.Modи компилируем:> -- Цитата:
> Compiler.Compile -p=Unix64	AMD64.Builtins.Mod Trace.Mod Linux.Glue.Mod Linux.Unix.Mod Unix.Machine.Mod Heaps.Mod Modules.Mod Unix.Objects.Mod KernelLog.Mod RealConversions.Mod Streams.Mod	Commands.Mod	env.Mod~Батник, который будет использован на сервере делаем через мощный юниксовый приёмШебанг:> -- Цитата:
> #!./oberon run env.txtПолный Шебанг (что-бы вставить команды прямо в этот батник, а не отдельным файлом) пока не получается, интерпретатор команд A2 пытается исполнить первую строчку#!./oberonи вылетает с ошибкой. Над этим ещё поработаю.