web-dev-qa-db-ja.com

ファイルが実行可能かどうかを確認します

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

62
bob

さまざまな test 演算子を見てください(これはtestコマンド自体のためですが、組み込みのBASHとTCSHのテストはほぼ同じです)。

-x FILEFILEが存在し、実行(または検索)パーミッションが付与されていることを示しています

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

ファイルのtypeを判別するには、 file コマンドを試してください。出力を解析して、出力ファイルの種類を正確に確認できます。 Word 'o警告:時々fileが複数行を返すことがあります。 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に応じて異なる出力を返します。ただし、Word 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つすべてで、Word executableとアーキテクチャ(x86-64i386、または32-bitを含むSPARC)が表示されます。


補遺

どうもありがとうございました。これを回答としてマークする前に、プログラムを実行できるかどうかを確認するために、 '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コマンドの出力はシステムによって異なる場合があるため、これらがシステムで機能することを確認する必要があります。また、実行可能ビットをチェックしています。ファイルがバイナリ実行可能ファイルであるが、実行可能ビットがオンになっていない場合、実行可能ファイルではないと言います。これはあなたが望むものではないかもしれません。

92
David W.

-x演算子がディレクトリとファイルを区別しないことに誰も気づいていないようです。

したがって、実行可能ファイルを正確にチェックするには、[[ -f SomeFile && -x SomeFile ]]を使用できます

10
osexp2003

また、シンボリックリンクの-x演算子に誰も気づいていないようです。通常のファイル(実行可能ファイルとして分類されていない)へのシンボリックリンク(チェーン)は、テストに失敗します。

4
Dick Guertin

ファイル、ディレクトリ、およびシンボリックリンクのテスト

ここで指定されたソリューションは、ディレクトリまたはシンボリックリンク(あるいはその両方)で失敗します。 Linuxでは、次を使用してファイル、ディレクトリ、およびシンボリックリンクをテストできます。

if [[ -f "$file" && -x $(realpath "$file") ]]; then .... fi

OS Xでは、homebrewでcoreutilsをインストールし、grealpathを使用できるはずです。

isexec関数の定義

便宜上、関数を定義できます。

isexec() {
    if [[ -f "$1" && -x $(realpath "$1") ]]; then
        true;
    else
        false;
    fi;
}

または単に

isexec() { [[ -f "$1" && -x $(realpath "$1") ]]; }

次に、以下を使用してテストできます。

if `isexec "$file"`; then ... fi
1
pyrocrasty