-
SHELL
[ Process = ] SHELL Command [ WAIT ] [ FOR { { READ | INPUT } | { WRITE | OUTPUT } } ] [ AS Name ] |
システムシェルを通じて子プロセスを実行してコマンドを実行します。
コマンドを管理するための内部Processオブジェクトが作成されます。
標準構文
コマンドは、システムシェル(/ bin / sh)に渡されるコマンドを含む文字列です。
- WAITが指定されている場合、インタプリタはコマンドが終了するのを待ちます。 それ以外の場合、コマンドはバックグラウンドで実行されます。
コマンドをチェーンしたい場合は、WAITキーワードを忘れないでください。そうしないと、最初のコマンドが終了する前に2番目のコマンドが開始されます。 |
- FORが指定されている場合は、コマンド入出力がリダイレクトされ、プログラムがそれらをインターセプトします。
- WRITEが指定されている場合は、共通の出力命令を持つProcessオブジェクトを使用して、コマンドの標準入力にデータを送信できます。PRINT、WRITE、...そのためにはProcessオブジェクトへの参照が必要です。
- READを指定すると、コマンドが標準出力ストリームにデータを送信するたびにイベントが生成されます。Readイベントは、データが標準出力ストリームに送信されると発生し、Errorイベントはデータが標準エラーストリームに送信されると発生します。 。 プロセス標準出力を読み込むには、Stream&Input / Output関数でプロセスオブジェクトを使用します。
- READおよびWRITEの代わりにINPUTおよびOUTPUTキーワードを使用すると、プロセスは仮想端末の内部で実行されます。 つまり、プロセスはそれ自体が真の端末内で実行されていることを認識します。
- Nameは、Processオブジェクトによって使用されるイベント名です。 デフォルトでは「Process」です。
Gambas 3では、デフォルトのイベント名はもうありません。 言い換えれば、Gambas 2と同じ振る舞いをするためにAs "Process"として追加しなければなりません。 |
割り当てを使用して作成した内部Processオブジェクトへの参照を取得できます。
Quick syntax
2番目の構文を使用すると、コマンドが実行され、インタプリタはその終了を待って、完全なコマンド出力が指定された文字列に書き込まれます。
実行したプロセスを管理することはできません。
プロセスの標準出力のみが取得されます。 エラー出力はリダイレクトされません。 両方の出力を混在させる必要がある場合は、シェルリダイレクト構文を使用してください。 シェル "command 2>&1" |
Environment
コマンド引数の直後にWITHキーワードを使用して、実行中のプロセスに新しい環境変数を指定できます。
[ Process = ] SHELL Command WITH Environment ... |
環境は文字列の配列で、各文字列は "NAME = VALUE"の形式を取ります。 NAMEは環境変数の名前、VALUEはその値です。
環境変数を消去したい場合は、文字列 "NAME ="を使用してください。
Running Inside A Virtual Terminal
プロセスが仮想端末内で実行されている場合、つまり構文FOR INPUT / OUTPUTを使用する場合は、実際の端末内で入力した場合と同じ効果を得るためにプロセス標準入力に制御文字を送信できます。 ^ Cはプロセスを停止し、^ Zはそれを中断します。
仮想端末には出力が1つだけあります。 その結果、実行中プロセスの標準エラー出力は、Readイベントを通じて受信されます。 |
プログラムによっては、仮想端末内で実行している場合にのみアクセス可能なコマンド行インターフェースがあります。 |
IDEコンソールは、Gambas 3.9以降、真のターミナルエミュレータになりました。 |
Specifying The Shell
Since 3.1
System.Shellプロパティを上書きすることで、コマンドの実行に使用するシェルを指定できます。
デフォルトでは、シェルコマンドは/ bin / shを介して実行されます。
Argument quoting
引数はシェルに送信されるので、端末画面でコマンドを入力しているかのようにそれらを引用符で囲む必要があります。
"perl -e '<>;' 'の間に印刷してください
または、Shell $関数を使用して、シェルによって変更されない引用符付き文字列を作成することもできます。
Examples
' Get the contents of a directory and print it to the standard output
Shell "ls -la /tmp" Wait
'ディレクトリの内容を文字列で取得する
Dim Result As String
Shell "ls -la /tmp" To Result
'バックグラウンドでディレクトリの内容を取得する
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
Process_Readイベントハンドラで読み込むことができるバイト数を知りたい場合は、Lof関数を使用してください。 |
プロセスIDを返し、プロセスを制御するためにAPI呼び出しを行うためにプログラマーに依存しているVB Shellコマンドとは異なり、Gambas Shell関数はオプションで、使用可能なProcessオブジェクトを返します 生み出されたプロセスを直接殺すか他の方法で制御するため。 さらに、VBの等価物とは対照的に、プロセスは同期的または非同期的に実行されてもよい。 |
See also
コメント
最新を表示する
NG表示方式
NGID一覧