Как сохранить вывод команды в OpenVMS
У меня возникла проблема с написанием DCL в OpenVMS: мне нужно, чтобы DCL вызывал команду и записывал ее вывод (но не выводил вывод на экран). Затем в DCL мне нужно распечатать этот вывод, который я сохранил.
Вот пример:
ICE SET FASTER !This command sets my environment to the "Faster" environment.
Приведенная выше команда выводит это, если выполняется непосредственно в OpenVMS:
Initialising TEST Environment to FASTER
--------------------------------------------------------------------------------
Using Test Search rules FASTER
Using Test Search rules FASTER
--------------------------------------------------------------------------------
dcl>
Поэтому я создал DCL, пытаясь обернуть этот вывод, чтобы отобразить более упрощенный вывод. Вот мой код пока:
!************************************************************************
$ !* Wrapper for setting ICE account. Outputs Environment
$ !************************************************************************
$ on error then goto ABORT_PROCESS
$ICE_DCL_MAIN:
$ ice set 'P1'
$ ICE SHOW
$ EXIT
$ABORT_PROCESS:
$ say "Error ICING to: " + P1
$ EXIT 2
[End of file]
В строках выше ICE SET 'P1' устанавливает ледовую среду, но я не хочу, чтобы этот вывод передавался в VMS. Но я хочу записать вывод переменной $ICE SHOW в переменную, а затем вывести его на экран в DCL (большая часть которого опущена для упрощения)
Итак, что должно быть выведено должно быть:
current Test Environment is DISK$DEVELOPERS:[FASTER.DEVELOP]
Вместо:
Initialising TEST Environment to FASTER
--------------------------------------------------------------------------------
Using Test Search rules FASTER
Using Test Search rules FASTER
--------------------------------------------------------------------------------
current Test Environment is DISK$DEVELOPERS:[FASTER.DEVELOP]
Я просмотрел руководство, и я немного запутался, поэтому решил, что попробую здесь. Буду признателен за любые указатели. Благодарю.
РЕДАКТИРОВАТЬ
Вот что я придумал после комментариев, проблема, с которой я столкнулся, заключается в том, что когда я подключаюсь к VMS с помощью эмулятора, такого как SecureCRT, выводится правильный вывод. Но когда я запускаю DCL через мою библиотеку SSH2 в.NET, она ничего не выводит. Я думаю, это потому, что он временно закрывает поток SYS$OUTPUT или что-то еще?
$ !************************************************************************
$ !* Wrapper for setting ICE account. Outputs Environment
$ !************************************************************************
$ on error then goto ABORT_PROCESS
$ICE_DCL_MAIN:
$ DEFINE SYS$OUTPUT NL:
$ ice set 'P1'
$ DEASSIGN SYS$OUTPUT
$ ice show
$ EXIT
$ABORT_PROCESS:
$ say "Error ICING to: " + P1
$ EXIT 2
[End of file]
РЕДАКТИРОВАТЬ 2
Так что, думаю, мне действительно нужно уточнить, что я здесь пытаюсь сделать. Блокировка вывода не так важна, я просто пытаюсь захватить его, например, в Символ.
Так, например, в C# у вас может быть метод, который возвращает строку. Таким образом, у вас будет строка myResult = vms.ICETo("FASTER"); и он вернет это и сохранит в переменной.
Я думаю, что я ищу похожую вещь в VMS, чтобы, как только я оказался в окружении, я мог позвонить:
$ environment == $ICE SHOW
Но я конечно получаю ошибки с этим утверждением
4 ответа
Команда $ assign/user_mode Thing Sys$Output
приведет к перенаправлению вывода на Thing
до тебя $ deassign/user_mode Sys$Output
или следующий исполняемый образ выходит. Назначение без /USER_MODE
квалификатор будет сохраняться до отмены назначения.
Thing
может быть логическим именем, спецификацией файла (LOG.TXT
) или нулевое устройство (NLA0:
) если вы просто хотите сбросить вывод.
Когда командная процедура выполнена, вывод может быть перенаправлен с использованием /OUTPUT
классификатор, например $ @FOO/output=LOG.TXT
,
И тогда есть трубопровод...
Вы можете перенаправить вывод во временный файл, а затем распечатать его содержимое:
$ pipe write sys$output "hi" > tmp.tmp
$ ty tmp.tmp
VMS - это не Unix, DCL - это не Bash: вы не можете легко установить символ DCL из вывода команды.
Ваше ICE SHOW печатает одну строку, верно? Первое слово всегда "актуально", верно?
Таким образом, вы можете создать взломать.
Сначала позвольте мне подделать вашу команду ICE:
$ create ice.com
$ write sys$output "current Test Environment is DISK$DEVELOPERS:[FASTER.DEVELOP]"
^Z
$
и я определяю путь dcl $, указывающий на каталог, где находится эта командная процедура, чтобы я мог использовать / подделать команду ICE
$ define dcl$path sys$disk[]
$ ice show
current Test Environment is DISK$DEVELOPERS:[FASTER.DEVELOP]
$
Теперь, что вам нужно, создайте командную процедуру, которая устанавливает работу логически
$ cre deflog.com
$ def/job/nolog mylog "current''p1'"
^Z
$
И я определяю команду "текущая" для запуска этой командной процедуры:
$ current="@deflog """
Да, вам нужно три двойных кавычки в конце строки!
И наконец:
$ pipe (ice show | @sys$pipe) && mysym="''f$log("mylog")'"
$ sh symb mysym
MYSYM = "current Test Environment is DISK$DEVELOPERS:[FASTER.DEVELOP]"
$
С другой стороны, я не знаю, что вы имеете в виду C# и Java. Можете ли вы уточнить это и сказать нам, что работает, где?
Вы можете попробовать использовать: DEFINE /USER SYS$OUTPUT NL:. Это работает только для следующей команды, и вам не нужно отменять назначение.
Делиться некоторыми из моего опыта здесь. Я использовал следующие методы для перенаправления выводов в файлы.
Определите / назначьте вывод пользователя, а затем выполните требуемую команду / скрипт. Вывод будет записан в.
$define /user sys$output <file_path>
execute your command/script
ИЛИ ЖЕ
assign /user <file_path> sys$output
execute your command/script
deassign sys$output
Чтобы перенаправить на нулевое устройство, как в Unix (упомянуто в ответах выше), вы можете использовать 'nl:' вместо
define /user sys$output nl:
or
assign /user nl: sys$output