lang • shell

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

Desde 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