sh:1:プログラムが見つかりません

sh:1:プログラムが見つかりません

インストールされたプログラムを呼び出してファイルを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実際にはエイリアスまたは関数です。一般的な実行可能ファイルの場合は にあり、PATHPerl とサブシェルを継承する必要があります。たとえば、Bashは、type -a procheck実際に実行されているものとエイリアスの後に隠されたディスクファイルなどの代替手段があるかどうかを確認するために使用できます。


ああ、コマンドを実行するときにシェルが必要ない場合は、systemリスト形式を使用してコマンドの引数を別の引数として渡すことで、Perlが誤ってコマンドを呼び出すのを防ぎますsystem。ここにありますsystem("procheck", $proc, "2.0")

答え2

問題は一重引用符を使用していることです。

これをやってください...

system ("procheck $proc 2.0");

関連情報