プログラムを実行せずにbashで実行可能かどうかを確認する最も簡単な方法は何ですか?ファイルに実行権があり、現在のシステムと同じアーキテクチャ(たとえば、Windows実行可能ファイルや、サポートされていない別のアーキテクチャ、システムが32ビットの場合は64ビットではないなど)であるかどうかを少なくとも確認する必要があります。
さまざまな test 演算子を見てください(これは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
ファイルの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-64
、i386
、または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
コマンドの出力はシステムによって異なる場合があるため、これらがシステムで機能することを確認する必要があります。また、実行可能ビットをチェックしています。ファイルがバイナリ実行可能ファイルであるが、実行可能ビットがオンになっていない場合、実行可能ファイルではないと言います。これはあなたが望むものではないかもしれません。
-x
演算子がディレクトリとファイルを区別しないことに誰も気づいていないようです。
したがって、実行可能ファイルを正確にチェックするには、[[ -f SomeFile && -x SomeFile ]]
を使用できます
また、シンボリックリンクの-x演算子に誰も気づいていないようです。通常のファイル(実行可能ファイルとして分類されていない)へのシンボリックリンク(チェーン)は、テストに失敗します。
ここで指定されたソリューションは、ディレクトリまたはシンボリックリンク(あるいはその両方)で失敗します。 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