外部コマンドを実行してその出力をそのまま出力するには

Scala

import scala.sys.process._;

val ret = "pwd"!;
# pwdコマンドの標準出力はそのまま標準出力される
# ret: Int = 0

PHP

system('ls -al');

外部コマンドでの出力はそのまま出力される。出力の最後の行は返り値でも取得できる。

fork, exec, wait を使う例

$pid = pcntl_fork();
if ($pid > 0) {
    // 親プロセスの場合
    pcntl_wait($status);
    // pcntl_waitは子プロセスのうちどれか1つが終了するまで待ち、
    // 終了ステータスを $status に保存する
    echo $status;
} else if ($pid == 0) {
    pcntl_exec("/bin/sleep", array("1"));
    die("exec失敗");
} else {
    die("fork失敗");
}

pcntl_forkpcntl_exec などの呼び出し時に

PHP Warning:  pcntl_fork() has been disabled for security reasons

などと表示されてしまう場合は、php.inidisable_functions の設定がされているので、それをコメントアウトするか、必要な関数を disable_functions から削除する。

Python

import os

os.system('ls -al');

外部コマンドでの標準出力・標準エラー出力はそのまま標準出力・標準エラー出力される。出力の最後の行は返り値でも取得できる。

コマンドが0を返した場合には、自分の環境で試した限りはos.systemの返り値が0になるみたいだけど、厳密にはos.systemが何を返すかは実装に依存するみたい。

Perl

system('ls -al');

この方法だと外部コマンド実行中に Ctrl+C を押しても、外部コマンドが終了するだけで、Perlスクリプトは終了してくれない。

Ctrl+C を押して外部コマンドだけでなくPerlスクリプト自体を終了させるには fork, exec, wait を使う。

my $pid = fork;
if ($pid) {
    # 親プロセスの場合
    wait;
    # waitは子プロセスのうちどれか1つが終了するまで待つ
} elsif (defined $pid) {
    # 子プロセスの場合
    exec('...');
    # exec呼び出すとそれ以降は実行されない
} else {
    # fork失敗の場合
    ...;
}
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。