私のスクリプトにはという関数があります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
誰かがより良いソリューションに接続できることを願っています。