lang • exec

EXEC

[ Processo = ] EXEC Comando [ WAIT ] [ FOR { { READ | INPUT } | { WRITE | OUTPUT } } ] [ AS Nome ]
EXEC Commando TO Variavel

Executa um comando. Um objeto Process é criado para gerenciar o comando.

O comando deve ser especificado como uma array de strings contendo ao menos um elemento. O primeiro elemento deste array é o nome do comando e os outros são parâmetros opcionais.

  • Se WAIT é especificado, então o interpretador espera pelo término do comando. Caso contrário, o comando é executado em background.

  • Se FOR é especificado, então as entradas e saídas do comando são redirecionadas de forma que o programa os intercepte:

    • Se WRITE é especificado, você pode enviar dados à entrada padrão do comando usando o objeto Process com instruções comuns de saída: PRINT, WRITE, ... Note que você pode precisar de uma referência ao objeto Process para isso.

    • Se READ é especificado, então eventos serão gerados cada vez que o comando enviar dados para sua stream de saída padrão: o evento Read é gerado quando dados são enviados para o stream de saída padrão, e o evento Error é gerado quando dados são enviados para o stream de erros padrão. Use o objeto Process com stream para ler a saída padrão do processo.

Se você usar as palavras chaves INPUT e OUTPUT ao invés de READ e WRITE, então o processo é executado dentro de um terminal virtual. Isso significa que o processo irá pensar que está rodando de um terminal verdadeiro.

Nome é o nome de evento usado pelo objeto Process. Por padrão, ele é "Process".

Você pode obter uma referência ao objeto Process interno criado usando uma atribuição.

Se você usar a segunda sintaxe, o comando é executado, o interpretador espera pelo seu término, e a saída completa do comando é colocada na string especificada.

Examples

' Obtém o conteúdo de um diretório
Exec ["ls", "-la", "/tmp"] Wait
' Coloca o conteúdo de um diretório em uma string
Dim sSaida As String
Exec ["ls", "-la", "/tmp"] To sSaida
' Coloca o conteúdo de um diretório em uma string, mas em background

Dim sSaida As String

' Um nome de evento específico é usado
Exec ["ls", "-la", "/tmp"] For Read As "Conteudos"

...

Public Sub Conteudos_Read()

  Dim sLinha As String

  Read #Last, sLinha, -256

  sSaida &= sLinha

End

Public Sub Conteudos_Kill()

  Print sSaida

End

Se você quiser saber quantos bytes você pode ler em um event handler Process_Read, use a função Lof.

Como os argumentos são enviados diretamente ao processo, você não tem que colocá-los entre aspas, como teria que fazer em um shell.

Examples

' perl -e 'print while <>;' se torna

Exec ["perl", "-e", "print while <>;"] For Read Write

Veja também