エラーメッセージを説明してください。

エラーメッセージを説明してください。

私のスクリプトにはという関数がありますmessages。 Linux Mintで書いて問題なく実行しましたが、Debianバスターステーションに移動したときの機能は/usr/bin/messages

以下を呼び出す起動スクリプトがありますmessages

起動スクリプト

# call to messages script
. messages

情報

messages() {
  # reformat the arguments and return them
}

後でスクリプトを開始

messages "This is a message"

投げるもの

./startup_script: line 35: .: /usr/bin/messages: cannot execute binary file
messages: could not open mailbox `/path/to/my/script/<string passed to my function>': No such file or directory

/usr/bin/messagesだから私の代わりに呼び出される関数に関連するエラーがたくさんあります。

を追加した後、関連するtype messages "This is a message"出力は次のようになります。

messages is /usr/bin/messages

関数の名前を変更することもできますが、この状況を処理するより良い方法があるかもしれません。

システムバイナリを無視し、独自の機能を使用するようにスクリプトにどのように指示しますか?


¹この関数は複数のスクリプトで複数回呼び出されるため、名前を変更するだけでは最も簡単なオプションではありません。

答え1

仕組み. file:

<スラッシュ>が含まれていない場合、fileシェルは指定された検索パスを使用してPATHファイルを含むディレクトリを見つけます。

この行動はPOSIXで指定

あなたの最初の間違いは

./startup_script: line 35: .: /usr/bin/messages: cannot execute binary file

電話をかけるときの状況は似ています. echo

-bash: .: /bin/echo: cannot execute binary file

バイナリファイルのソースを取得しようとしています/usr/bin/messages。実際、関数を定義するファイルにはソースがまったくなく、現在のスクリプトには関数が定義されていません。これは、後でmessagesまだ/usr/bin/messages機能ではないことを意味します。

関連行は、または. ./messages. /full/path/to/messagesパスなど)でなければなりません。あなたのバイナリファイルではないファイル)。

答え2

エラーメッセージを説明してください。

エラーメッセージの行番号を確認してください。。これにより、エラーが発生した行がわかります。 35行以上のスクリプトでいくつかの行を見せたので、私たちはこれを知りませんでした。

実行するファイル。

. file-to-sourceファイルを使用または指定すると、file-to-run環境変数にリストされているディレクトリが左から右に検索されます。$PATH現在、ディレクトリはセキュリティ上のリスクがあるか、少なくとも混乱する可能性があるため、このリストにはありません。現在のディレクトリでプログラムを実行するので、そのプログラムが現在のディレクトリにあることを指定する必要があります。たとえば、. ./file-to-sourceまたは./file-to-run(フルパスを提供する必要はありません)。

Unixは.それが問題であることに気づくまでPATHを持っていました。たとえば、ls現在のディレクトリに呼ばれるプログラムを配置します。 Microsoft WindowsのCMDはまだ.暗黙的であるため、PATH削除できません。これがこのオペレーティングシステムにマルウェアがたくさん存在する理由の1つです。

.スクリプトが存在するディレクトリではなく、現在の作業ディレクトリを表します。

この問題を解決するには、次のようにします。

(
   cd "$(dirname "$(readlink -f "$0")")"
   script_dir="$(pwd)"
)
script_dir/other_script

誰かがより良いソリューションに接続できることを願っています。

関連情報