Richiamo di comandi shell da Squeak o Pharo
Domanda
Come si possono invocare i comandi di shell da Squeak e Pharo? Questi ambienti hanno qualcosa al loro interno come la funzione system () in alcuni linguaggi unix per eseguire comandi shell esterni, o i backtick (non possono farli qui fare all'editor, ma cosa ottieni quando premi il tasto a sinistra di " ; 1 "e sopra" TAB "per catturare l'output dei comandi?
Soluzione
In Squeak puoi usare CommandShell , ma non so cosa (se non altro ) è disponibile per Pharo in questo momento.
Altri suggerimenti
Penso che tu possa usare il pacchetto OSProcess per fare quello che vuoi. Inoltre, penso che sia meglio chiedere nella mailing list di squeak-dev o pharo.
Hai due soluzioni:
Utilizza il pacchetto ProcessWrapper. Pro: installazione semplice e veloce. Contro: funzionalità limitata, solo su win32.
Utilizza il pacchetto OSProcess / CommandShell. Pro: funzionalità abbastanza buone (pipe, varianti di ambiente, area di lavoro simile a una shell ...) e multipiattaforma. Contro: è necessario utilizzare gli strumenti VMMaker per creare il plug-in esterno.
Sto usando Windows 10 con Pharo 6 e ho trovato impossibile usare le classi OSProcess
o OSSubprocess
(difficile da installare o le versioni più recenti non sono supportate per Windows).
Ciò che funziona per me è LibC. Puoi reindirizzare stderr a un file usando 2 >
all'interno del comando:
errors := '/tmp/errors.txt'.
result := LibC uniqueInstance system:
'echo "Hello World" > /tmp/hello.txt 2>', errors.
result = 0 ifFalse: [ errors asFileReference ]
È possibile manipolare le variabili di ambiente usando (anche se restituisce un valore di 1 che implica un errore in Windows):
OSEnvironment current setEnv: 'MY_ENVIRONMENT_VARIABLE' value: '1'.
Tuttavia, non sono stato in grado di cambiare la directory corrente:
OSEnvironment current changeDirectoryTo: myDirectory asFileReference. "--> doesNotUnderstand for Windows"
Per risolvere il problema, fare il CD con il comando:
result := LibC uniqueInstance system:
'cd ', myDirectory, ' && ls > /tmp/output.txt 2>', errors.
Su Windows, c'è un wrapper nell'API Win che ti consente di farlo:
| 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
Ci sono molti supporti per la maggior parte di ciò che Windows può fare con i processi (env, ...)
Quindi, cerca nel catalogo OSWindows.