私は、このエラーメッセージで失敗し、非常に単純なPerlスクリプトがあります。ここではのperl:SH:1:構文エラー:不正FD数
sh: 1: Syntax error: Bad fd number
は、スクリプト(二行)
#!/usr/bin/perl
system("xterm >& /dev/null &");
があります
コマンドラインから同じxtermコマンドを実行すると動作します。 Perlスクリプトから、それはしません。なにが問題ですか?
私は、このエラーメッセージで失敗し、非常に単純なPerlスクリプトがあります。ここではのperl:SH:1:構文エラー:不正FD数
sh: 1: Syntax error: Bad fd number
は、スクリプト(二行)
#!/usr/bin/perl
system("xterm >& /dev/null &");
があります
コマンドラインから同じxtermコマンドを実行すると動作します。 Perlスクリプトから、それはしません。なにが問題ですか?
system(EXPR)
はための短いすなわち[1]
system("/bin/sh", "-c", EXPR)
は、Bourneシェルコマンドをとります。
xterm >& /dev/null &
は有効なbourneシェルコマンドではありません。あなたが望む
xterm >/dev/null 2>&1 &
多分あなたはPerlの外でそれをテストしたときに別のシェルを使用しました。
技術的には、Windowsの場合を除い
use Config qw();
system($Config::Config{sh}, "-c", EXPR)
に近いです。後者は他のリダイレクト形態と混同することができるので
これはPerlでかなり新しいですか? "xterm>&/ dev/null&"はPerl 5.10でうまく動作します。 –
システム( "set
@JB_Userこれは、ユーザの好みのシェルである '$ SHELL'環境変数を表示します。それが 'system'によって使われているわけではありません。実際、POSIXの 'system'は常に' sh'を使うように指定されています。 – ephemient
まず、バッシュにstdoutとstderrの両方をリダイレクトするための好適な構文は、&>
、ない>&
あります。
第2に、system
は、デフォルトのシェルとは異なる動作をする/bin/sh
を使用します。
は
system("xterm >/dev/null 2>&1 &");
か、完全にシェルをスキップのように、明示的にそれを書いてみてください。
if (fork() == 0) {
open STDOUT, '>', '/dev/null';
open STDERR, '>&', *STDOUT;
exec "xterm";
POSIX::_exit();
}
答えをありがとう。私はそれを働かせた。今、私の元のスクリプトがなぜいくつかのシステムでは動作するが、他のシステムでは動作しないのを解明しようとしている。 –
@JB_User '/ bin/sh'はどこでも同じではないためです。いくつかの一般的なLinuxディストリビューションはDashを使い、他の人はBashを使います。 BSDは主に灰を使用します。 – ephemient
オリジナルのスクリプトが機能するかどうかを簡単に伝える方法はありますか?ダッシュ、バッシュ、アッシュ?私は彼らが何であるかを知らない。 Dashのウィキペディアのページはありません。 –
私のために働きます(エラーなし)。 – toolic
ヒットが私の質問にどのように答えるかわかりません。その人はPerlスクリプトを実行していませんでした。 –