Вызов команд оболочки из Squeak или Pharo
Вопрос
Как вы можете вызывать команды оболочки из Squeak и Pharo? Есть ли в этих средах что-то, например, функция system () в определенных языках Unix для запуска внешних команд оболочки или обратные галочки (их нельзя заставить сделать это в редакторе, но то, что вы получаете, нажимая клавишу слева от " ; 1 "и выше" TAB ") для захвата вывода команд?
Решение
В Squeak вы можете использовать CommandShell , но я не знаю, что (если что-нибудь ) в настоящее время доступна для Pharo.
Другие советы
Я думаю, что вы можете использовать пакет OSProcess, чтобы делать то, что вы хотите. Кроме того, я думаю, что лучше спросить в списке рассылки squeak-dev или pharo. Р>
У вас есть два решения:
Используйте пакет ProcessWrapper. Плюсы: быстрая и простая установка. Минусы: ограниченная функциональность, только на win32.
Используйте пакет OSProcess / CommandShell. Плюсы: довольно хорошая функциональность (каналы, переменные окружения, оболочка, похожая на оболочку ...) и кроссплатформенность. Минусы: необходимо использовать инструменты VMMaker для создания внешнего плагина.
Я использую Windows 10 с Pharo 6 и обнаружил, что невозможно использовать классы OSProcess
или OSSubprocess
(сложно установить или последние версии не поддерживаются для Windows).
Для меня работает LibC. Вы можете перенаправить stderr в файл, используя 2 >
внутри команды:
errors := '/tmp/errors.txt'.
result := LibC uniqueInstance system:
'echo "Hello World" > /tmp/hello.txt 2>', errors.
result = 0 ifFalse: [ errors asFileReference ]
Можно манипулировать переменными среды с помощью (хотя он возвращает значение 1, означающее сбой в Windows):
OSEnvironment current setEnv: 'MY_ENVIRONMENT_VARIABLE' value: '1'.
Однако мне не удалось изменить текущий каталог:
OSEnvironment current changeDirectoryTo: myDirectory asFileReference. "--> doesNotUnderstand for Windows"
Обходной путь должен сделать CD в команде:
result := LibC uniqueInstance system:
'cd ', myDirectory, ' && ls > /tmp/output.txt 2>', errors.
В Windows на Win API есть оболочка, позволяющая вам сделать это:
| sqlPlusExe sqlPlusRunInDir scriptPathString|
scriptPathString := (FileLocator imageDirectory / 'data' / 'sqlplus' / 'testquit.sql') pathString.
sqlPlusExe :='C:\oraclexe\app\oracle\product\11.2.0\server\bin\sqlplus.exe /nolog @' , scriptPathString.
sqlPlusRunInDir := 'C:\oraclexe\app\oracle\product\11.2.0\server\bin'.
sqlPlusWinProcessInformation := WinProcess
createAndWaitForProcess: sqlPlusExe
withCurrentDirectory: sqlPlusRunInDir
Существует большая часть поддержки того, что Windows может делать с процессами в ней (env, ...)
Итак, поищите в каталоге OSWindows.