モーセスクリプトのインストール中の問題

モーセスクリプトのインストール中の問題

重複の可能性:
/bin/sh: ./check-dependent.pl: 見つかりませんが、check-dependent.pl は存在します。

コンパイル中にエラーが発生しましたmoses-script。内容は次のとおりです。

minakshi@minakshi-Vostro-3500:~/Desktop/monu/moses/scripts$ make release
# Compile the parts
make all
make[1]: Entering directory `/home/minakshi/Desktop/monu/moses/scripts'
# Building memscore may fail e.g. if boost is not available.
# We ignore this because traditional scoring will still work and memscore isn't used by default.
cd training/memscore ; \
      ./configure && make \
      || ( echo "WARNING: Building memscore failed."; \
           echo 'training/memscore/memscore' >> ../../release-exclude )
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for g++... g++
checking whether the C++ compiler works... yes
checking for C++ compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for style of include used by make... GNU
checking dependency style of g++... gcc3
checking for gcc... gcc
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking dependency style of gcc... gcc3
checking for boostlib >= 1.31.0... yes
checking for cos in -lm... yes
checking for gzopen in -lz... yes
checking for cblas_dgemm in -lgslcblas... no
checking for gsl_blas_dgemm in -lgsl... no
checking how to run the C++ preprocessor... g++ -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking n_gram.h usability... no
checking n_gram.h presence... no
checking for n_gram.h... no
checking for size_t... yes
checking for ptrdiff_t... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands
make[2]: Entering directory `/home/minakshi/Desktop/monu/moses/scripts/training/memscore'
make  all-am
make[3]: Entering directory `/home/minakshi/Desktop/monu/moses/scripts/training/memscore'
make[3]: Leaving directory `/home/minakshi/Desktop/monu/moses/scripts/training/memscore'
make[2]: Leaving directory `/home/minakshi/Desktop/monu/moses/scripts/training/memscore'
touch release-exclude # No files excluded by default
pwd=`pwd`; \
    for subdir in cmert-0.5 phrase-extract symal mbr lexical-reordering; do \
      make -C training/$subdir || exit 1; \
      echo "### Compiler $subdir"; \
      cd $pwd; \
    done
make[2]: Entering directory `/home/minakshi/Desktop/monu/moses/scripts/training/cmert-0.5'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/home/minakshi/Desktop/monu/moses/scripts/training/cmert-0.5'
### Compiler cmert-0.5
make[2]: Entering directory `/home/minakshi/Desktop/monu/moses/scripts/training/phrase-extract'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/home/minakshi/Desktop/monu/moses/scripts/training/phrase-extract'
### Compiler phrase-extract
make[2]: Entering directory `/home/minakshi/Desktop/monu/moses/scripts/training/symal'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/home/minakshi/Desktop/monu/moses/scripts/training/symal'
### Compiler symal
make[2]: Entering directory `/home/minakshi/Desktop/monu/moses/scripts/training/mbr'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/home/minakshi/Desktop/monu/moses/scripts/training/mbr'
### Compiler mbr
make[2]: Entering directory `/home/minakshi/Desktop/monu/moses/scripts/training/lexical-reordering'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/home/minakshi/Desktop/monu/moses/scripts/training/lexical-reordering'
### Compiler lexical-reordering
## All files that need compilation were compiled
make[1]: Leaving directory `/home/minakshi/Desktop/monu/moses/scripts'
/bin/sh: ./check-dependencies.pl: not found
make: *** [release] Error 127

このエラーが発生する理由を知りませんか? check-dependent.pl ファイルは scripts フォルダにあります。

答え1

私の直感:./check-dependencies.pl最初から#!/usr/local/bin/perl。最初の行をに変更します#!/usr/bin/perl

説明:プログラムを実行すると、カーネルはファイルをメモリーにロードして実行します。ただし、多くの実行可能ファイル(実際にはほとんど)は直接実行できませんが、他のプログラムであるローダーが必要です。

  • ほとんどのバイナリは動的に接続されているため動的リンカー/lib/ld-linux.so.232ビットプログラムの場合、/lib64/ld-linux-x86-64.so.264ビットプログラムの場合)プログラムが要求したライブラリをロードする役割を担います。
  • スクリプトは対応するインタプリタを介してロードする必要があります。

カーネルは、次から始まるスクリプトを認識します。シェルボーンワイヤー。 shebang行はスクリプトの最初の行で、文字#!とインタプリタのフルパスで構成されています。 (オプション)行には、スペースとその後にインタプリタに渡される引数を含めることもできます。

たとえば、スクリプトがで始まると、#!/usr/local/bin/perl -wカーネルはスクリプトを実行するように指示されたときにスクリプトを実行します/usr/local/bin/perl -w /path/to/script。実行に失敗すると、/usr/local/bin/perlエラーメッセージが表示されます。カーネルはエラーコードのみを報告でき、他の情報は報告できないため、スクリプトが存在しないかインタプリタが存在しない場合、カーネルの情報は同じです。

この場合、一部のシェルはエラー条件を再確認し、スクリプトが存在するがカーネルが「ファイルが見つかりません」と報告した場合は、「無効なソルバー」などの他のメッセージを印刷します。しかし、Ubuntu()のデフォルトのスクリプトシェル/bin/shはDashです。これはスクリプトをすばやく実行するように設計されており、このような追加の利便性はありません。したがって、単純な「ファイルが見つかりません」というレポートが表示されます。

多くのPerlスクリプトは、#!/usr/local/bin/perlほとんどの非LinuxインストールではPerlパスで始まります。お使いのコンピュータでこれを作成すると役に立ちます。これをシンボリックリンクにし、/usr/bin/perlそれを使用するときは他のインタプリタに対しても同じことを行います。

cd /usr/local/bin
ln -s ../../../bin/bash ../../bin/perl ../../bin/python ../../bin/ruby .

スクリプトを作成するときに次のshebang行を作成すると、この問題を回避できます#!/usr/bin/env perl。これは、インタプリタにパラメータを渡さない場合にのみ実行できます。バラより私のshebangとして「#!/path/to/NAME」の代わりに「#!/usr/bin/env NAME」を使用する方が良いのはなぜですか?この可能性について議論しましょう。

関連情報