1. ホーム
  2. bash

[解決済み] ファイルが実行可能かどうかをチェックする

2023-01-29 19:03:20

質問

あるプログラムがbashで実行可能かどうか、実行せずに確認する最も簡単な方法は何でしょうか?少なくとも、ファイルが実行権限を持っていて、現在のシステムと同じアーキテクチャ(たとえば、Windowsの実行ファイルや他のサポートされていないアーキテクチャではなく、システムが32ビットの場合は64ビットではなく、...)であるかどうかを確認する必要があります。

どのように解決するのですか?

さまざまな テスト 演算子を見てください (これは test コマンド自体に対するものですが、組み込みの BASH と TCSH のテストは多かれ少なかれ同じです)。

ということに気づくでしょう。 -x FILE FILEが存在し、実行(または検索)権限が付与されています。 .

BASH、Bourne、Ksh、Zshスクリプト

if [[ -x "$file" ]]
then
    echo "File '$file' is executable"
else
    echo "File '$file' is not executable or found"
fi

TCSHまたはCSHスクリプト。

if ( -x "$file" ) then
    echo "File '$file' is executable"
else
    echo "File '$file' is not executable or found"
endif

を決定するために タイプ を判断するには ファイル コマンドを試してみてください。出力を解析して、どのような種類のファイルであるかを正確に確認することができます。 単語 'o 警告 : 時々 file は1行以上を返します。以下は、私の Mac で起こったことです。

$ file /bin/ls    
/bin/ls: Mach-O universal binary with 2 architectures
/bin/ls (for architecture x86_64):  Mach-O 64-bit executable x86_64
/bin/ls (for architecture i386):    Mach-O executable i386

file コマンドはOSによって異なる出力を返します。しかし executable という単語は実行可能なプログラムでは表示され、通常はアーキテクチャも表示されます。

上記を私の Linux ボックスで表示されるものと比較してみてください。

$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped

そしてSolarisボックス。

$ file /bin/ls
/bin/ls:        ELF 32-bit MSB executable SPARC Version 1, dynamically linked, stripped

この3つの中で、単語 executable とアーキテクチャ( x86-64 , i386 または SPARC32-bit ).


追記

<ブロッククオート

どうもありがとうございます。これを回答とする前に、プログラムを実行できるかどうかを確認するために、「file」に対してどのようなスクリプトシェルチェック(つまり、どのようなパース)を行わなければならないかについてご教示いただけないでしょうか。もしそのようなテストが一般的に困難であるならば、私は少なくともそれがlinuxの実行ファイルであるかosX(Mach-O)であるかをチェックしたいのです。

思いつく限りでは、BASHでこんなことができそうです。

if [ -x "$file" ] && file "$file" | grep -q "Mach-O"
then
    echo "This is an executable Mac file"
elif [ -x "$file" ] && file "$file" | grep -q "GNU/Linux"
then
    echo "This is an executable Linux File"
elif [ -x "$file" ] && file "$file" | grep q "shell script"
then
    echo "This is an executable Shell Script"
elif [ -x "$file" ]
then
    echo "This file is merely marked executable, but what type is a mystery"
else
    echo "This file isn't even marked as being executable"
fi

基本的にはテストを実行し、それが成功したら file コマンドの出力を grep しています。その際 grep -q は何も出力せず、grepの終了コードを使って文字列を見つけたかどうか確認することを意味します。もしあなたのシステムが grep -q を受け付けない場合は grep "regex" > /dev/null 2>&1 .

ここでも、出力された file コマンドの出力はシステムによって異なる可能性があるので、これらがあなたのシステムで動作するかどうかを確認する必要があります。また、実行可能ビットのチェックも行っています。ファイルがバイナリ実行ファイルであっても、実行可能ビットがオンになっていなければ、実行可能ではないと言うことにしています。これはあなたが望むものではないのかもしれません。