Interactive shell что это за программа
Программа, интерпретирующая shell-программы, находится в файле /bin/sh. При запуске ее первый аргумент является именем shell-программы, остальные передаются как позициональные параметры. Если файл, содержащий shell-программу, имеет право выполнения (x), то достаточно указания лишь его имени. Например, следующие две команды операционной системы эквивалентны (если файл ficofl обладает указанным правом и на самом деле содержит shell-программу):
sh ficofl -d . g* и ficofl -d . g*
4.2. Выполнение
При выполнении shell-программ выполняются все подстановки. Если имя команды совпадает с именем специальной команды, то она выполнается в рамках текущего процесса. Так же выполняются и определенные пользователем функции.
Если имя команды не совпадает ни с именем специальной команды, ни с именем функции, то порождается новый процесс и осуществляется попытка выполнить указанную команду.
Переменная PATH определяет путь поиска директории, содержащей данную команду. По умолчанию это
🔥🔥🔥 EFI Shell — при включении компьютера что делать? / how install Windows 10? ✅
::/bin:/usr/ bin:/util:/dss/rk
Директории поиска разделяются двоеточиями; :: означает текущую директорию. Если имя команды содержит символ /, значение $PATH не используется: имена, начинающиеся с / ищутся от корня, остальные — от текущей директории. Положение найденной команды запоминается shellом и может быть опрошено командой hash.
4.3. Окружение
Окружение — это набор пар имя-значение, которые передаются выполняемой программе. Shell взаимодействует с окружением несколькими способами. При запуске shell создает переменную для каждой указанной пары, придавая ей соответствующее значение.
Если вы измените значение какой-либо из этих переменных или создадите новую переменную, то это не окажет никакого влияния на окружение, если не будет использована команда export для связи переменной shell’а с окружением (см. также set -a). Переменная может быть удалена из окружения командой unset (см.). Таким образом, окружение каждой из выполняемых shell’ом команд формируется из всех неизмененных пар имя-значение, первоначально полученных shell’ом, минус пары, удаленные командой unset, плюс все модифицированные и измененные пары, которые для этого должны быть указаны в команде export.
Окружение простых команд может быть сформировано указанием перед ней одного или нескольких присваиваний переменным. Так,
TERM=d460 и (export TERM; TERM=d460; )
эквивалентны. Переменные, участвующие в таких присваиваниях, назовем ключевыми параметрами.
Если установлен флаг -k (см. set), то все ключевые параметры помещаются в окружение команды, даже если они записаны после команды.
4.4. Сигналы
UNIX’ом поддерживаются следующие сигналы:
Сигналы SIGINT и SIGQUIT игнорируются, если команда была запущена асинхронно. Иначе сигналы обрабатываются так же, как в процессе-предке, за исключением сигнала SIGSEGV (см. также Специальные команды. Trap).
4.5. Замечания
При выполнении команд запоминается их местонахождение. Поэтому при создании команды с тем же именем, но находящейся в другой директории, все равно будет выполняться старая команда (если вызов происходит по короткому имени). Для исправления ситуации воспользуйтесь командой hash с ключом -r (см. Специальные команды).
uefi interactive shell | Восстановление работы загрузчика на примере Windows
Если вы переименовали текущую или вышележащую директорию, то команда pwd может давать неверную информацию. Для исправления ситуации воспользуйтесь командой cd с полным именем директории.
5. Дополнительные сведения
5.1. Команда test
Команда test применяется для проверки условия. Формат вызова:
test или [ ]
Команда test вычисляет и, если его значение — истина, возвращает код завершения 0 (true); иначе — ненулевое значение (false). Ненулевой код завершения возвращается и если опущены аргументы. может состоять из следующих примитивов:
5.2. Команда expr
Команда expr применяется для вычисления выражений. Результат выводится на стандартный вывод. Операнды выражения должны быть разделены пробелами. Метасимволы должны быть экранированы. Надо заметить, что 0 возвращается в качестве числа, а не для индикации пустой строки. Строки, содержащие пробелы или другие специальные символы, должны быть заключены в кавычки.
Целые рассматриваются как 32-битные числа.
Ниже приведен список операторов в порядке возрастания приоритета, операции с равным приоритетом заключены в фигурные скобки. Перед символами, которые должны быть экранированы, стоит .
Регулярное выражение строится следующим образом:
Все остальные символы (и ^, если стоит не в квадратных скобках) обозначают самих себя. Для указания символов ., *,[ и ] надо экранировать их (т.е. писать ., *, [, ]).
Примеры.
a=`expr $a + 1`
— увеличение на 1 переменной a
expr $a : ‘.*/(.*)’ | $a
— выделяет из имени файла короткое имя (т.е. из /usr/util/ena выделяется ena). Внимание, одиночный символ / будет воспринят как знак операции деления.
expr $VAR : ‘.*’
— получение количества символов переменной VAR.
В качестве побочного эффекта expr возвращает следующие коды завершения:
Команда expr также выдает следующие сообщения об ошибках:
Замечание.
Допустим, что мы хотим сравнить значение переменной a с каким-либо символом, имеющим для expr особый смысл, например, со знаком равенства. Пусть $a на самом деле является знаком равенства. Так как аргументы предварительно обрабатываются shell’ом, то команда
expr $a = ‘=’
будет воспринята как
expr = = =
что синтаксически некорректно. В подобных случаях надо пользоваться таким приемом:
expr X$a = X=
т.е. добавлением некоторого символа к обеим строкам, что никак не влияет на результат сравнения, однако позволяет избежать синтаксической ошибки.
5.3. Команда ena
Команда ena позволяет получить части полного имени файла. Первый аргумент — флаг, второй — имя файла. Команда различает следующие флаги:
Ниже приводится текст программы ena, хранящийся в /util/ena.
# Get part of pathname case $1 in -n ) expr $2 : ‘.*/(.*)[.].*’ | $2 : ‘(.*)[.].*’ | $2 ;; -f ) expr $2 : ‘.*/(.*)’ | $2 ;; -e ) expr $2 : ‘.*([.][^./]*)’ | ‘ ‘ ;; -d ) expr $2 : ‘(.*)/.*’ | $2 ;; -p ) expr $2 : ‘([.])/.*’ | $2 : ‘([.][.])/.*’ | ‘ ‘ ;; * ) echo «error: unknown part of pathname $1» exit 2 ;; esac
- 16.12 — В России утверждён план импортозамещения ПО, на которое потратят более 200 млрд руб.
- 16.12 — С февраля Роскомнадзор зафиксировал утечку 600 млн записей о россиянах
- 16.12 — В России зарегистрировано объединение, которое займётся поддержкой разработчиков видеоигр
- 16.12 — Microsoft без лишнего шума запретила майнинг криптовалют в облаке Azure
- 16.12 — «Яндекс» представил карты нового поколения
- 16.12 — Безос и Гейтс инвестировали в прямого конкурента Neuralink Маска
- 14.12 — Представлен релиз Firefox 108
- 14.12 — Amazon не стала оспаривать назначенные в России штрафы на сумму в 4 млн рублей
- 14.12 — Apple выпустила iOS 16.2 — сквозное шифрование для фото и бекапов в iCloud, режим караоке и многое другое
- 14.12 — Apple, вероятно, разрешит скачивать приложения в обход App Store уже в iOS 17
- 14.12 — Netac представила модули DDR5 с частотой до 8000 МГц на чипах SK hynix
- 14.12 — Qualcomm анонсировала чипы для домашних роутеров с поддержкой Wi-Fi 7 и скоростью до 20 Гбит/с
- 14.12 — Microsoft купила разработчика необычного оптоволокна Lumenisity
- 13.12 — Доступна мобильная платформа /e/OS 1.6, развиваемая создателем Mandrake Linux
- 13.12 — В России утверждён ГОСТ для электросамокатов, моноколёс и гироскутеров — они не должны быть быстрее 25 км/ч
- 13.12 — ИИ помог астрономам точно выявить тысячу ранее неизвестных сверхновых
- 13.12 — Европейские регуляторы расследуют сделку по поглощению VMware компанией Broadcom
- 13.12 — Поисковик «Яндекса» заменил собой «Поиск Mail.ru»
- 13.12 — Китай испытал трамплинную систему отделения гиперзвукового самолёта от стартового носителя
- 13.12 — Релиз ядра Linux 6.1
Источник: citforum.ru
Что такое Shell
Если вы пользуетесь Linux, то рано или поздно, поиски решения какой-либо задачи приводили вас к терминалу. Это очень эффективное средство взаимодействия с операционной системой. Вы можете быстро выполнять нужные команды, получать результат и объединять несколько команд в цепочку. Один из самых основных компонентов терминала — это командная оболочка или Shell.
В этой статье мы поговорим о том, что такое Shell в Linux, зачем нужна командная оболочка, какие функции она выполняет и как развивались командные оболочки за последнее время.
Что такое Shell
Shell или командная оболочка — это программа, которая организовывает среду для выполнения других программ и команд Командная оболочка имеет свои встроенные команды, арифметические операторы и другие синтаксические выражения, но основная её задача упрощать запуск других программ. Именно командная оболочка занимается поиском программ в текущем каталоге и в путях, указанных в переменной среды PATH, управляет сменой текущего каталога и переменными окружения. Таким образом, основная задача оболочки — интерпретировать команды пользователя и выполнять их не зависимо от того внешние ли это программы или внутренние команды.
Чтобы понять с чем вы имеете дело, командой оболочки или внешней программой можно воспользоваться командой whereis. Например команда cd, это не программа, а встроенная команда оболочки, как и bg и fg:

А вот команда ls — уже внешняя программа, исполняемый файл которой расположен в файловой системе.
Командная оболочка — это традиционный способ ввода данных в Unix подобных операционных системах. Командные оболочки появились почти сразу же после появления Unix и привычных нам интерфейсов взаимодействия с компьютером. Первой командной оболочкой была Thompson Shell, разработанная Кеном Томсоном в Bell Labs в 1971 году. Уже тогда поддерживалось перенаправление ввода-вывода команд с помощью туннелей, а также поддерживались простые условные операторы.
Циклы while в командных оболочках появились чуть позже, в оболочке PWB Shell, разработанной Джоном Машеу на основе Thompson Shell. Но современный вид командная оболочка приобрела только с выходом оболочки Борна (Bourne Shell) в 1979 году. В ней было уже автодополнение имен файлов и команд, стандартные переменные окружения и привычные управляющие структуры. Исполняемый файл этой оболочки имел такой путь в системе — /bin/sh. В современных системах это обычно ссылка на используемую оболочку.
Именно вдохновляясь идеями этой оболочки потом была разработана оболочка Bash (Bourne Again Shell) используемая сейчас по умолчанию в большинстве дистрибутивов Linux. Она уже была разработана Браеном Фоксом в рамках проекта GNU в 1989 году. С тех пор прошло много времени и эта оболочка сильно устарела. Поэтому были разработаны и другие более современные командные оболочки, такие как ZSH и Fish.
Оболочка Zsh появилась незадолго после Bash в 1990 году, но она уже имеет намного больше функций, например, есть автодополнение для cd, когда выводится список папок из которого можно выбрать нужную:

Поддерживается автодополнение для параметров команд, например, для git можно вывести доступные команды вместе со справкой:

И это только несколько из всех преимуществ оболочки, кроме того она поддерживает цветные темы для вывода приглашения, а также довольно сильно расширяется с помощью плагинов.
Ещё более современная оболочка fish (Friendly Interactive Shell), появившаяся в 2005 году. Она поддерживает все стандартные возможности командной оболочки, но кроме того имеет удобную подсветку синтаксиса команд во время введения, удобный поиск команд, как Ctrl+R только по умолчанию, но самое удобное здесь это скрипты. Они намного проще для начинающих пользователей.
Если вы не меняли командную оболочку, то очень высока вероятность, что у вас используется Bash. Самый простой способ узнать какая оболочка у вас используется на данный момент, посмотреть содержимое переменной окружения SHELL:

Ещё один способ узнать текущую оболочку — воспользоваться командной ps. Если ей передать опцию -p и идентификатор процесса, то она покажет информацию о нём. Вывести идентификатор процесса текущей оболочки можно с помощью символов $$. Поэтому выполните:

В данном случае видно, что используется ZSH. Для того чтобы посмотреть все оболочки, установленные в вашей системе, просто выведите содержимое файла /etc/shells:

Все эти оболочки можно использовать выполнения команд от пользователей. Оболочка настраивается в файле /etc/passwd, для каждого пользователя отдельно. Поэтому посмотреть какая оболочка настроена для того или иного пользователя можно в этом файле. Например, для текущего пользователя команда будет выглядеть так:
grep «^$USER» /etc/passwd | awk -F: ‘< print $7>’

Выводы
В этой статье вы узнали что такое Shell, а также как развивались командные оболочки от момента их появления до наших дней. Как видите, это очень удобный инструмент, и даже графический интерфейс не может его полностью заменить.
Похожие записи
Нет похожих записей.
Оцените статью
(6 оценок, среднее: 5,00 из 5)
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .
Об авторе
Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.
Источник: losst.pro
Что такое хост Windows Shell Experience и почему он занимает так много памяти?
Работая на компьютере под управлением Windows 10, вы возможно, сталкивались с одной или двумя потребляющими память программами и службами. Если вы никогда не удосужились проверить, то важно взглянуть на диспетчер задач, чтобы узнать, сколько ресурсов памяти потребляет ваш компьютер. Хост Windows Shell часто является виновником накопления памяти в Windows 10. Давайте посмотрим, что такое Windows Shell Experience Host, и решим проблемы, связанные с переполнением памяти.
Что такое хост Windows Shell Experience?
Универсальные приложения Windows (UWP) всегда представлены в интерфейсе Windows. Способ представления этих универсальных приложений является основной функцией хоста взаимодействия с оболочкой Windows.
Функция этого процесса позволяет обрабатывать множество графических элементов, относящихся к апплетам Windows. Он обрабатывает такие элементы, как меню «Пуск», визуальные элементы для уведомлений и даже прозрачность панели задач.
Распространенный случай использования этого процесса — когда вы устанавливаете фон рабочего стола в слайд-шоу. В этом случае вы только что воспользовались помощью хоста оболочки Windows (Windows Shell Experience).
Если вы испытываете всплеск потребления памяти, то это нормально. Со временем он нормализуется. Если вы видите использование этого процесса ЦП больше 25% и со временем он не успокаивается, то есть проблемы.
Источник: dzen.ru
Запуск Wscript.Shell и Shell.Application. Заметки
Общих обзоров и материалов на эту тему уже достаточно, данная заметка не претендует на полноценную публикацию или исследование нюансов. Рассматривается только ОС Windows и только с точки зрения разработчика 1С, без подробностей системного администрирования и погружения в API винды.
Переход по навигационным ссылкам (открытие страниц, запуск программ по протоколам) и открытие/запуск приложений по ассоциированным файлам не рассматриваем. В общем случае разработчику доступны два командных процессора, cmd или powershell.
Это именно исполнители команд, передающие далее ядру ОС более низкоуровневые команды; они доступны из консолей, пункта меню «Выполнить», они лежат в основе многих действий графических оболочек и системных менеджеров. При этом, cmd не имеет «надстройки», и обращение к ней это всегда консольная команда.
А вот powershell предоставляет оболочку над утилитой, что упрощает некоторые действия, но создаёт путаницу между собственно процессором и его «управляющим» объектом в памяти некоего процесса. Причём, эта оболочка позволяет вызвать выполнение cmd.
Сложно сказать, в каких терминологических отношениях, например, находятся API-функции и процессоры, поэтому фиксируем лишь практически важные, прикладные моменты. Важно не путать, что мы запускаем (какой процессор) и чем запускаем (какая оболочка).
Под оболочкой рассматриваем СОМ-объект, созданный динамически в ходе исполнения кода на языке 1С, безотносительно, на сервере 1С это или на клиенте. Для запуска разработчику доступны две оболочки, WScript.Shell и Shell.Application. Суть одинакова: создаётся их объект, ведётся работа с его методами и свойствами, а суть — в исполнении командной строки, команды, обычно с параметрами.
В общем случае командой может быть директива ОС, собственно команда, запуск пакетного файла (скрипта), запуск исполняемого файла, открытие файла по ассоциации ОС итд. В общем случае всё это можно звать запускаемым сценарием.
Запуск может ждать завершения, т.е. остановить процесс-инициатор до момента окончания/прерывания/вылета запущенного процесса, либо продолжить процесс-инициатор и взаимодействовать с запущенным в реальном времени. Называть ли это асинхронностью или многопоточностью — не столь важно, но с помощью взаимодействия нескольких запущенных процессов и их «родителя» можно добиться параллельности некоторых действий.
Правильнее вообще говорить не столько об ожидании завершения, сколько об управляемости запущенного. В обоих случаях запущенный что-то получает на вход, что-то отдаёт на выход (и как код возврата, и, если предусмотрел разработчик, как подробные выходные данные), что-то сообщает при ошибке. Всё это — общеизвестные потоки StdIn, StdOut, StdErr.
Разумеется, не считая собственных фишек запускаемой команды, например, чтения из где-то лежащих файлов, записи в реестр итд. Поток можно читать поэтапно, целиком, направлять в переменную или файл, и всё это доступно либо на уровне файловых команд, либо через свойства и методы оболочек. Можно напрямую прописывать вывод результатов исполнения в файл (> и >>, т.е. полная перезапись и дописывание соответственно), учитывая доступ к местоположению такого файла. WScript.Shell Каждый экземпляр объекта WScript автоматически создаётся сервером сценариев (CScript.exe или WScript.exe) в момент вызова конструктора. Регистрация в СОМ+ и DCOM не требуется. Создание:
Оболочка = Новый COMОбъект(«WScript.Shell»); // во времена 8.2 это не всегда работало, требовалось «подружить» 1С и WSH
О свойствах оболочки
Некоторые полезные свойства:
* Разумно проверять текущее значение Оболочка.CurrentDirectory — это может быть совсем не та папка, что казалось бы. Изначально — в большинстве случаев — та, откуда был запущен скрипт. Важно в смысле доступа для последующих действий.
* Окружение можно смотреть из свойства Оболочка.Environment, содержащего коллекцию с значениями переменных. Можно уточнить, какой тип переменных нужен: Environment(СтроковоеИмяТипа)
System — системные переменные окружения (именно её возвращает по умолчанию)
User — пользовательские переменные окружения
Volatile — временные переменные окружения
Process — переменные окружения текущего командного окна
В разных ОС список конкретных переменных различается. Из свойств объекта Оболочка можно выяснить путь, имя, версию сервера сценариев, что полезно при расследовании нетипичного поведения.
В некоторых случаях в передаваемой командной строке надёжнее писать путь вызова в формате 8х3, т.е. «C:Progra~1» итд. По завершении работы с Оболочка её надо принудительно приравнять Неопределено.
Если объект был создан на управляемой форме, то, за исключением общеизвестного «удержания», контекст и занимаемая память по закрытии формы будут сброшены, а вот если создан из общего модуля, и сложился ещё ряд факторов, то может остаться в памяти, в т.ч. по завершении создавшего сеанса. Оболочка, в свою очередь, позволяет создавать процессы ОС, как объекты типа WshScriptExec (некоторые источники утверждают, что может потребоваться доступ ко всем зарегистрированным классам, на практике не сталкивался). Опять же, можно запускать консольно: cscript.exe ПутьВКавычкахКФайлуСценария (запуск сценариев пакетно). Такой подход позволяет указать, какой сервер сценариев применять (CScript.exe или используемый по умолчанию WScript.exe), можно подавить вывод диалогов и сообщений сценария.
С возможностью управления Запуск с порождением отдельного дочернего управляемого процесса, без ожидания завершения. Процесс = Оболочка.Exec(СтрокаЗапуска);
О свойствах процесса
Некоторые свойства:
* ProcessID – идентификатор процесса, позволяет манипулировать им в различных методах Оболочки. В диспетчере задач виден на серверных ОС.
* Status – число: если процесс выполняется, то 0, если прекратил свою работу то 1 (неважно, по какой причине прекратил). * Arguments содержит коллекцию, позволяющую обращаться к именным и безымянным параметрам скрипта по отдельности, и многое другое. Например:
// Условия, при которых эта коллекция доступна после завершения запущенного процесса, зависят от вида сервера сценариев. Для каждого Аргумент Из Оболочка.Arguments Сообщить(Аргумент); КонецЦикла;
* Interactive — можно разрешать/запрещать интерфейсное взаимодействие с пользователем, что важно на клиенте. Также можно проверять с его помощью, не был ли скрипт запущен в пакетном режиме (параметр «//B» сервера сценариев). * ExitCode возвращает результат (именно и только для уже завершённого), обычно это некое число. Также в документациях упоминаются расширенные свойства:
* OutputEncoding — строковое имя кодировки потоков, но, всегда ли оно есть у WshScriptExec, в документациях не нашёл;
* HasExited — булево; завершён ли (опять же, без детальной диагностики, по какой причине). Во многих примерах фигурирует свойство, которое крайне нестабильно работает в 1С: Оболочка.Timeout, якобы позволяющее до запуска указать, через какое заданное в секундах время остановить процесс. Не рекомендую с ним связываться, т.к. по аналогии с обработчиком ожидания, таймер, похоже, тикает лишь при некоторых условиях, и тупит при большой нагрузке. По умолчанию время исполнения сценария не ограничено.
Другие способы, связанные с RunAs
Есть способ запуска из объекта FolderItems или FolderItem методом InvokeVerb, и InvokeVerbEx с конкретизацией параметров:
objFolderItem.InvokeVerbEx(«open», «c:my.bat») — т.е. над одной папкой или каждой из коллекции выполнить указанное действие.
Это именно действие ОС (если задано для коллекции, в т.ч. по вложенным папкам, то работает не рекурсивно). Допустимые возможные действия для объекта можно получить из его свойства-коллекции Verbs. На практике использования из 1С не встречал.
Есть способ запуска с применением «System32runas.exe» — консольной утилиты, которая априорно выполняет указанную команду/директиву/скрипт с повышением прав. В части логина и пароля администратора утилита также взаимодействует с Windows Credential Manager — требует либо явного указания имени пользователя и пароля, либо использования saved credentials. Тут это уже не глагол, как уточняющий аргумент в методе, а просто отдельная программа.
Например, runas /user:ИмяДоменаЛогинАдмина «C:Windowsnotepad.exe» — это запуск блокнота под админом в домене.
Если надо запустить программу от имени доменного пользователя с компьютера, который не добавлен в домен AD, или в бездоменной сети, то команда будет такая:
runas /netonly /user:contosoИмяЮзера cmd.exe — и это при условии, что в сетевых настройках ПК указан DNS-сервер, способный корректно интерпретировать обращение; ну или указывать IP.
Если для запуска программы от другого пользователя не требуется загружать его профиль, можно указать параметр /noprofile — запуск станет гораздо быстрее, но если запускаемый процесс опирается на данные, хранящиеся в профиле того пользователя, то его работа будет некорректна или невозможна. Встречал в интеграции 1С с драйверами внешних устройств.
Примечания
1. По некоторым утверждениям, PowerShell может зависать при обработке входного потока, если не указать «-InputFormat none», когда была передана явно прописанная команда «-Command «%cmd%»»; для нас это может представлять интерес при передаче, например, параметра запуска при консольном старте 1С.
2. По некоторым утверждениям, ShellExecute лучше, чем все методы WScript.Shell, для запуска ярлыков, т.е. зарегенных приложений по lnk, по скорости запуска. Не проверял, но советую взять на заметку.
3. Если рассматривать глагол как дочерний объект от построенного объекта запуска, то у него есть свойство Name и метод DoIt, однако это эквивалентно передаче в скрипте или команде, и для нужд запуска без приостановок и принудительных возобновлений хода процесса интереса не представляет.
4. В ряде случаев при недостатке прав и использовании runas может потребоваться однократная правка реестра для запускаемого приложения, иначе будет выдано сообщение в духе «выполнение сценариев отключено в этой системе.», т.к. самостоятельно перезапустить сценарий уже как отдельный процесс под админом 1С может и не суметь; иногда лучше такое организовать в bat-файл.
5. В ряде случаев может потребоваться отслеживать по SID, с каким процессом имеем дело — исходным или уже админским, если нужна детальная диагностика (например, по потребляемым ресурсам).
6. Методы запуска не следует путать с методом Оболочка.FileRun(), который просто выдаёт консольное окно, ждущее команды пользователя, аналог «Выполнить», но ничего само не делает.
Общие моменты * Всегда учитывать, что VBScript разрешает пропускать необязательные параметры методов, а JScript нет! Особенно при заимствовании кода и копи-пасте с примеров в сети))) * Ключевое значение имеет кодировка — и путей, передаваемых как параметры, и команд, и строк в скриптах, и потоков.
Есть кодировка, указанная напрямую в файле скрипта (chcp), и есть, в которой записан файл скрипта и читаются файлы потоков, их нельзя путать и следует проверять/настраивать отдельно. Не стоит уповать на 1С-ный Юникод или системные настройки по умолчанию.
Кавычку, например, для верности лучше задавать напрямую как Символ(34). * Следует быть аккуратнее с расшаренными ресурсами, и с теми, запись в которые виртуализируется. У виртуальных дисков в консольных запусках порой запаздывает отклик ОС по доступу, в т.ч.отказ. * Если прав по UAC недостаточно, то при запуске на клиенте может вылезти consent.exe с диалогом запроса подтверждения, а на сервере просто втихую не запустится.
До потоков вывода и ошибок. До каких-то объектных действий.
В таких случаях команду лучше обёртывать запускаемым файлом-скриптом (как делает БСП), а на сервере только смотреть журнал ОС насчёт ошибок, смотреть настройки безопасности IE (при нужде добавлять server-ivc в доверенную зону, с которой разрешён запуск исполняемых). * Создание сом-объекта, естественно, оборачиваем в попытку-исключение и, естественно, нам доступно только позднее связывание, т.к. такие вещи как Active-Х и тем более OLE статично в объекты 1С не впихнуть. И не забываем про деструктор и уборку мусора за собой. * Если надо содержимое консольного окна успеть посмотреть, а оно закрывается, используем (например, последней командой в скрипте) команду PAUSE, но тогда помним про особенности чтения потока вывода.
По мнению «1С» На ИТС сравнительно мало конкретики, посвящённой особенностям работы СОМ-объектов с оболочками ОС, и она разрозненна. Процитирую наиболее полезное: «При запуске внешней программы из кода требуется составлять строку запуска таким образом, чтобы она собиралась только из проверенных частей. если одна из частей, из которых собирается строка запуска, содержит данные, полученные из базы данных, из поля ввода на форме или прочитаны из хранилища настроек, то перед запуском программы требуется проверить, являются ли запуск безопасным. Безопасными считаются такие строковые данные, которые не содержат в себе следующие символы: «$», «`», «|», «||» «;», «, «». Данное требование распространяется на все способы запуска программ.» С одной стороны, выглядит разумно; с другой — наличие в списке символа «;» делает небезопасным, например, запуск другой 1С по строке соединения /IBConnectionString, «благодаря» чему воспользоваться БСП для таких действий затруднительно.
Как сделано в БСП
В современной БСП принята концепция «оборачивания» любой команды в скрипт, куда в любом случае дописывается указание кодировки. Т.е. даже если вы скомпоновали свой скрипт и передаёте путь к нему, учтите — он будет вызван из другого скрипта. Разработчику доступны методы:
ФайловаяСистемаКлиент.ЗапуститьПрограмму (в клиентском коде);
ФайловаяСистема.ЗапуститьПрограмму (в серверном коде) Как работают оба метода:
Если нужно получение потока вывода и/или потока ошибок, то объявляются временные файлы stdout.tmp и stderr.tmp, и к самой строке команды дописывается перенаправление потока в них (перезаписью). Создаётся отдельный текстовый документ с именем run.bat, и в него пишется следующее:
Файл run.bat и на сервере, и на клиенте сохраняется просто как временный файл. А дальше.
// Для файловых ИБ запускают: Оболочка = Новый COMОбъект(«Shell.Application»); КодВозврата = Оболочка.Run(ПутьИмяБатФайла, 0, ДождатьсяЗавершения); // Для серверных ИБ запускают: ЗапуститьПриложение(ПутьИмяБатФайла, , ДождатьсяЗавершения, КодВозврата);
Если указана необходимость дождаться завершения, то файл удаляется принудительно после запуска, не дожидаясь конца сеанса. Если ждать завершения не надо, тут может возникнуть потенциальная утечка памяти, т.к. сеанс 1С, натыкаясь на невозможность удалить порождённый им временный файл, просто игнорирует его и закрывается без лишних жалоб.
При необходимости (если дождались завершения), читаются файлы потоков (с помощью ЧтениеТекста, сразу целиком и в той же кодировке, что скрипт), и также принудительно удаляются. Опять-таки, если завершения не ждать, то и работать с файлами потоков разработчику придётся самостоятельно. На практике подобный подход, обёртывание в bat, показал меньшую стабильность при работе в фоновых заданиях, чем прямое указание команды. Ну и, если дело на клиенте, и фокус «уплыл», и пользователь случайно нажал Ctrl+Break, то ведь оно и остановиться может.
P.S. Всё вышеизложенное — так или иначе — баян и повтор. После блестящей статьи Ю.Пермитина вообще мало смысла освещать эту тему. Поэтому — просто заметка, скорее даже для себя. Аккордеон-антисклерозник.
P.P.S. Тухлые помидоры приветствуются, но, по возможности, конструктивные.
Источник: infostart.ru