SHELL
[ Process = ] SHELL Command [ WAIT ] [ FOR { { READ | INPUT } | { WRITE | OUTPUT } } ] [ AS Name ]
SHELL Command TO Variable
Executa um comando, através de um processo filho em um shell do sistema.
Um objeto
Process interno é criado para gerenciar o comando.
Sintaxe padrão
O comando é uma string que contém os comandos passado para o shell do sistema (
/bin/sh
).
-
Se
WAIT
for especificado, então o interpretador aguarda o comando até o final. Caso contrário, o comando é executado em segundo plano.
Não esqueça da palavra-chave Wait se você quiser esperar os comandos da string, do contrário, o segundo comando vai começar antes do primeiro acabar!
-
Se
FOR
é especificado, o comando de entrada-saída são redirecionados para que o programa possa interceptá-los:
-
Se
WRITE
for especificado, você pode enviar dados para a entrada padrão de comando usando o objeto Process com instruções de saída comuns: PRINT, WRITE, ... Observe que para isso, você precisa de uma referência para o objeto Process.
-
Se
READ
for especificado, os eventos são gerados a cada vez que o comando envia dados para seus streams de saída padrão: o evento Read é gerado quando os dados são enviados para o stream de saída padrão, e o evento Error é gerado quando os dados são enviados para o stream de erro padrão. Use o objeto processo Funções de Stream e Entrada/Saída para ler a saída padrão do processo.
-
Se você usar a palavras-chave
INPUT
e OUTPUT
em vez de READ
e WRITE
, então o processo é executado dentro de um terminal virtual. Isso significa que o processo vai pensar que está executando dentro de um terminal de verdade.
-
Name
é o nome do evento usada pelo objeto Process. Por padrão, ele é "Process"
.
Em Gambas 3, não há mais nenhum nome de eventos padrão.
Em outras palavras, você deve adicionar
As "Process"
para obter o mesmo comportamento que Gambas 2.
Você pode obter uma referência para o objeto
Process interno criado usando uma atribuição.
Sintaxe Rápida
Se você usar a segunda sintaxe, o comando é executado e o interpretador espera o seu fim, e a saída do comando completo é colocado na string especificada.
Você não terá controle sobre o processo executado.
Somente a saída padrão do processo é recuperada. A saída de erro não é redirecionada.
Se você precisa concatenar ambas as saídas, use a sintaxe de redirecionamento do shell:
Shell "command 2>&1" To Result
Ambiente
Você pode especificar novas variáveis de ambiente para a execução do processo, usando a palavra-chave
WITH logo após o argumento do comando:
[ Process = ] SHELL Command WITH Environment ...
Environment é uma matriz de strings, cada string com a seguinte forma:
"NAME=VALUE"
.
NAME
é o nome da variável de ambiente,
VALUE
poderá ser o seu valor.
Se você quiser apagar uma variável de ambiente, é só usar a string
"NAME="
.
Executando dentro de uma Terminal Virtual
Se o processo é executado dentro de um terminal virtual, ou seja, se você usar a sintaxe
FOR INPUT /
OUTPUT, então, você pode enviar caracteres de controle para a entrada padrão do processo para obter o mesmo efeito como se você os digitasse dentro de um terminal real.
^C
pára o processo,
^Z
suspende, e assim por diante.
Um terminal virtual tem apenas uma saída. Por conseguinte, a saída de erro padrão do processo de execução é recebido através do evento Read
.
Alguns programas têm uma interface de linha de comando que é acessível apenas se estiver rodando dentro de um terminal virtual.
Se você pretende controlar uma aplicação através do envio de comandos para a entrada padrão, então, os testes serão realizados fora do IDE (ou seja, fazer um executável e executá-lo na linha de comando), o console dentro do ambiente de desenvolvimento não é um verdadeiro terminal virtual e pode causar resultados inesperados.
Especificando o Shell
Since 3.1
Você pode especificar qual shell será usado para executar o comando com a propriedade
System.Shell.
Por padrão, o comando shell é executado através de
/bin/sh
.
Delimitando argumentos
Quando os argumentos são enviados para um shell, você tem que delimitá-los, como se estivesse escrevendo o comando em uma tela de terminal.
SHELL "perl -e 'print while <>;'" FOR READ WRITE
Ou você pode usar a função
Shell$
para criar uma string que não serão modificadas pelo shell.
Exemplos
' Obtém o conteúdo de um diretório e o imprimi para a saída padrão
Shell "ls -la /tmp" Wait
' Obtém o conteúdo de um diretório para uma string
Dim Result As String
Shell "ls -la /tmp" To Result
' Obtém o conteúdo de um diretório em segundo plano
Dim Result AS String
Shell "ls -la /tmp" For Read As "Process"
...
Public Sub Process_Read()
Dim sLine AS String
sLine = Read #Last, -256
Result &= sLine
Print sLine;
End
Se você quiser saber quantos bytes você pode ler em um manipulador de eventos
Process_Read
, utilize a função
Lof.
Ao contrário do comando
Shell do VB , que retorna a identificação do processo e depende do programador para fazer chamadas de API para controlar o processo, a função
Shell do Gambas opcionalmente retorna um objeto
Process (se for usado como uma atribuição
AS a uma variável declarada
Process) que pode ser utilizado para
matar ou controlar diretamente o processo gerado. Além disso, o processo pode ser executado de modo síncrono ou de modo assíncrono, em contraste com o equivalente em VB .
Veja também