Кодовая страница Unix мейнфрейма для прямого отображения SYSPRINT или SYSOUT

#unix #cobol #mainframe #codepages

Вопрос:

Здравствуйте, это мой первый вопрос к StackOverflow, не уверен в форуме и теме.

Участвуя в инициативе по открытым мэйнфреймам с использованием кода Visual Studio и шпатлевки для Unix, я разработал пример программы на языке COBOL, в которой показаны международные поговорки (на данный момент на немецком, английском, французском, испанском, латыни). Он отлично работает в пакетном режиме с JCL в файл и вызывается из REXX. В файле я не вижу специальных символов для неанглийских языков, но мне повезло с двойной программой в PL/1 (делаю то же самое и показываю специальные символы в REXX).

Теперь мой вопрос: я также пытался позвонить по mvscmd из сценария Unix bash. Пока это работает, но не показывайте мне специальные символы. Хорошо, у меня есть последний шанс позвонить в mvscmd с Python. Или, в качестве альтернативы, я могу перенести файл из MVS в unix (по любой причине он автоматически преобразуется, и я вижу содержимое моих специальных символов). Где есть место, чтобы справиться с этим? Кобол? (как я уже сказал, по любой причине PL/1 может это сделать. Я использую только стандартное редактирование put в PL/1 против отображения в Cobol). Преобразование Sysprint/Sysout? Любой специалист может мне помочь?

Комментарии:

1. Не могли бы вы показать пример кода (COBOL, REXX, скрипт оболочки) и JCL? Пожалуйста, отредактируйте свой вопрос и вставьте его в формате образца кода, а не изображения.

2. «Я не вижу специальных символов» — что вы используете для просмотра выходных данных? Как предполагается кодировать выходные данные?

Ответ №1:

Здравствуйте и извините за поздний повтор. Ну, весь код немного многоват, но я думаю, что моя проблема в следующем — MVSCMD напрямую закодирован в сценарии оболочки

 #!/bin/sh
parm='Z08800.FYD.DATA'
#echo "arg1=>"$1"<"
[ ! -z "$1" ] amp;amp; parm=$parm","$1
#echo "arg2=>"$2"<"
[ ! -z "$2" ] amp;amp; parm=$parm","$2
#echo "parm=>"$parm"<"

mvscmd --pgm=saycob --args=$parm 
    --steplib='z08800.fyd.load' 
    --sysin=dummy 
    --sysout=*
 

У меня есть еще несколько сценариев оболочки, но это главное. Я напрямую отправил его в sysout (это диплей COBOL. Я могу использовать фиксированную строку или мое высказывание, прочитанное из файла MVS). При использовании программы PL/1 последний файл затем является sysprint, потому что PL/1 создает его путем РЕДАКТИРОВАНИЯ.

Я предполагаю, что моя кодовая страница довольно неправильная. Но я не знаю, как это исправить. Я использовал некоторые настройки в оболочке, но LANG остается на C ??? Кстати, этот Unix кажется довольно старым, и у меня есть возможность использовать его только до августа. Мой основной интерес заключается в использовании программы на мэйнфреймах и в JCL и/или REXX. Но они дали нам шанс с этим встроенным Unix (?), Поэтому я тоже хотел попробовать. Прямой вывод из программы COBOL в терминал Unix.

Я имел в виду, что при выполнении программы на мэйнфрейме, а затем просмотре файла результатов в редакторе ISPF (старые вещи) с помощью PF3 я вижу специальные символы на немецком, испанском и французском языках. Так что они там, кажется, производятся COBOL и PL/1.

При передаче файла MVS (своего рода PDS) в UNIX с помощью MVSCMD это также нормально (специальные символы), но это не то, что я хотел.

Я попытался использовать Python вместо плоской оболочки, но все пошло еще хуже. Я не могу направить Sysout на терминал, все, что может вызвать Python, находится на мэйнфрейме и в файловой системе MVS. Так что я должен передать его после. Это слишком накладно для моих глаз, когда я говорю 7 высказываний, и я хочу, чтобы они отображались в терминале Unix, lol.

Ответ №2:

Вот мой РЕКС, который делает свое дело

 /* rexx */
ARG PARM1 PARM2

PARAMETER = '/Z08800.FYD.DATA'

If Length(PARM1) > 0
   Then PARAMETER = PARAMETER","PARM1
If Length(PARM2) > 0
   Then PARAMETER = PARAMETER","PARM2
PARAMETER = "'"PARAMETER"'"

Address TSO "Alloc File(sysprint) Dataset(*)"
Address TSO "Alloc File(sysin) Dummy"

Address TSO "Call fyd.load(saypli)" PARAMETER

Address TSO "Free  File(sysprint)"
Address TSO "Free  File(sysin)"
 

Теперь это другая нагрузка, PL/1, но COBOL делает то же самое с Sysout вместо Sysprint.

Он отображается в моем терминале REXX, который также вызывается ISPF, а затем отображается на панели редактирования. Программа не имеет ручного ввода, но считывает файл. И да, высказывания здесь не выделяются, я читаю их с помощью динамического выделения, но не имеет значения, откуда мои строки поступают на ОТОБРАЖЕНИЕ / ВВОД РЕДАКТИРОВАНИЯ

Ответ №3:

И это теперь JCL. ОК работает немного по-другому, он сохраняется для участника PDS

 //SAYCOB JOB
//COBCLG  EXEC IGYWCLG,
//             PARM.GO='Z08800.FYD.DATA'
//         SET MBR=SAYCOB
//COBOL.SYSIN  DD DSN=amp;SYSUID..FYD.SOURCE(amp;MBR),DISP=SHR
//LKED.SYSLMOD DD DSN=amp;SYSUID..FYD.LOAD(amp;MBR),DISP=SHR
//GO.SYSOUT    DD SYSOUT=*
//*-------------------------------------------------------------
//*
//*-------------------------------------------------------------
//SAYCOB  EXEC PGM=amp;MBR,PARM='Z08800.FYD.DATA,001,007'
//STEPLIB   DD DSN=amp;SYSUID..FYD.LOAD,DISP=SHR
//SYSOUT    DD DSN=amp;SYSUID..FYD.OUTPUT(amp;MBR),DISP=SHR
//*-------------------------------------------------------------
//LIST    EXEC PGM=LINE80,PARM='/80'
//STEPLIB   DD DSN=amp;SYSUID..FYD.LOAD,DISP=SHR
//SYSIN     DD DSN=amp;SYSUID..FYD.OUTPUT(amp;MBR),DISP=SHR
//SYSPRINT  DD SYSOUT=*
//
 

Здесь, в параметре, я даю им библиотеку моих высказываний, а затем распределяю по PL/1 или COBOL. Я, конечно, могу показать, но это немного многовато, около 200 строк… Проблема, я думаю, не в MVS, а в кодовой странице Unix.