インストールされたプログラムを呼び出してファイルを1つずつ実行するスクリプトを作成しました。同じプログラムが同じ端末で実行されるとprocheck abc.pdb
正常に動作します。しかし、Perlスクリプトでこのプログラムを実行すると、
#!/usr/bin/perl -w
@proc = glob '*.pdb';
foreach $proc (@proc)
{
system ('procheck $proc 2.0');
}
エラーが発生しました
sh: 1: procheck: not found
答え1
ここで問題になる可能性がある2つのことがあります。まず、一重引用符で囲まれた文字列を使用すると変数が拡張されないため、system()
呼び出し時にリテラル文字列が表示されますprocheck $proc 2.0
。これにはシェル固有の文字($
)が含まれているため、Perlはシェルを介してコマンドを実行するため、シェルはそれを拡張する機会があります。環境に変数が含まれていない場合は、proc
何も拡張されません。しかし、シェルはそうすることprocheck
ができないようで、問題にはなりませんPATH
。
引用符を二重引用符に変更すると、Perlは変数を拡張します(ループ内で変数を使用しているので、おそらく望むものです)。ただし、Perlから見つからないというメッセージが表示されることがありますprocheck
。
解決策は、プログラムのフルパスを提供するか、そのパスがスクリプトにあることを確認することですPATH
。
インタラクティブシェルで実行すると機能できますが、procheck
実際にはエイリアスまたは関数です。一般的な実行可能ファイルの場合は にあり、PATH
Perl とサブシェルを継承する必要があります。たとえば、Bashは、type -a procheck
実際に実行されているものとエイリアスの後に隠されたディスクファイルなどの代替手段があるかどうかを確認するために使用できます。
ああ、コマンドを実行するときにシェルが必要ない場合は、system
リスト形式を使用してコマンドの引数を別の引数として渡すことで、Perlが誤ってコマンドを呼び出すのを防ぎますsystem
。ここにありますsystem("procheck", $proc, "2.0")
。
答え2
問題は一重引用符を使用していることです。
これをやってください...
system ("procheck $proc 2.0");