2017-04-10 13 views
-1

私は、このエラーメッセージで失敗し、非常に単純なPerlスクリプトがあります。ここではのperl:SH:1:構文エラー:不正FD数

sh: 1: Syntax error: Bad fd number 

は、スクリプト(二行)

#!/usr/bin/perl 
system("xterm >& /dev/null &"); 
があります

コマンドラインから同じxtermコマンドを実行すると動作します。 Perlスクリプトから、それはしません。なにが問題ですか?

+0

私のために働きます(エラーなし)。 – toolic

+0

ヒットが私の質問にどのように答えるかわかりません。その人はPerlスクリプトを実行していませんでした。 –

答えて

4
system(EXPR) 

ための短いすなわち[1]

system("/bin/sh", "-c", EXPR) 

は、Bourneシェルコマンドをとります。

xterm >& /dev/null & 

は有効なbourneシェルコマンドではありません。あなたが望む

xterm >/dev/null 2>&1 & 

多分あなたはPerlの外でそれをテストしたときに別のシェルを使用しました。


  1. 技術的には、Windowsの場合を除い

    use Config qw(); 
    system($Config::Config{sh}, "-c", EXPR) 
    

    に近いです。後者は他のリダイレクト形態と混同することができるので

+0

これはPerlでかなり新しいですか? "xterm>&/ dev/null&"はPerl 5.10でうまく動作します。 –

+0

システム( "set

+0

@JB_Userこれは、ユーザの好みのシェルである '$ SHELL'環境変数を表示します。それが 'system'によって使われているわけではありません。実際、POSIXの 'system'は常に' sh'を使うように指定されています。 – ephemient

2

まず、バッシュに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(); 
} 
+0

答えをありがとう。私はそれを働かせた。今、私の元のスクリプトがなぜいくつかのシステムでは動作するが、他のシステムでは動作しないのを解明しようとしている。 –

+0

@JB_User '/ bin/sh'はどこでも同じではないためです。いくつかの一般的なLinuxディストリビューションはDashを使い、他の人はBashを使います。 BSDは主に灰を使用します。 – ephemient

+0

オリジナルのスクリプトが機能するかどうかを簡単に伝える方法はありますか?ダッシュ、バッシュ、アッシュ?私は彼らが何であるかを知らない。 Dashのウィキペディアのページはありません。 –

関連する問題