[解決済み] ファイルが実行可能かどうかをチェックする
質問
あるプログラムが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
または
SPARC
で
32-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
コマンドの出力はシステムによって異なる可能性があるので、これらがあなたのシステムで動作するかどうかを確認する必要があります。また、実行可能ビットのチェックも行っています。ファイルがバイナリ実行ファイルであっても、実行可能ビットがオンになっていなければ、実行可能ではないと言うことにしています。これはあなたが望むものではないのかもしれません。
関連
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで変数が設定されているかどうかを確認する方法は?
-
[解決済み] Bashでファイルの中身をループする
-
[解決済み] Bashで標準出力と標準エラーの両方をファイルにリダイレクトして追記する方法
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
-
[解決済み] Bashでコマンドの前に環境変数を設定すると、パイプ内の2番目のコマンドで動作しない
-
[解決済み] sed を使ってファイルの名前を大量に変更する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] IFS=$' \n' の正確な意味は何ですか?
-
[解決済み] Bashで$PATH変数からパスを削除する最もエレガントな方法は何ですか?
-
[解決済み] シェルスクリプトによるDockerコンテナ内でのスクリプトの実行
-
[解決済み] 複数のbashスクリプトにまたがってpushd/popdのスタックを表示しない (quiet pushd/popd)
-
[解決済み] Bashでファイルの内容を既存ファイルの末尾に追加する [重複]。
-
[解決済み] ループ内でユーザー入力を読み取る
-
[解決済み] Bashの引数で引用符を維持するには?重複
-
[解決済み] bashのifブロックの中でboolean変数を評価する方法は?重複
-
[解決済み] 現在のシェル内でコマンドの出力を実行するには?