Проверьте, является ли файл исполняемым
Мне интересно, какой самый простой способ проверить, выполняется ли программа с помощью bash, не выполняя ее ? Он должен по крайней мере проверить, имеет ли файл права на выполнение и имеет ту же архитектуру (например, не исполняемый файл windows или другую неподдерживаемую архитектуру, а не 64 бита, если система 32 бита,...) как действующая система.
4 ответа:
взгляните на различные тест операторы (это для самой тестовой команды, но встроенные тесты BASH и TCSH более или менее одинаковы).
Вы заметите, что
-x FILE
говорит файл существует и разрешение на выполнение (или поиск) предоставляется.BASH, Bourne, Ksh, zsh Script
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
определить тип из файла это, попробуйте file. Вы можете проанализировать вывод, чтобы увидеть, какой именно тип файла это. Слово о предупреждение: иногда
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
The
file
команда возвращает различные выходные данные в зависимости от ОС. Однако слово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 box:
$ file /bin/ls /bin/ls: ELF 32-bit MSB executable SPARC Version 1, dynamically linked, stripped
во всех трех, вы увидите слово
executable
и архитектуре (x86-64
,i386
илиSPARC
С32-bit
).
дополнительное соглашение
спасибо Вам большое, это кажется путь. Прежде чем я отмечу это как свой ответ, не могли бы вы указать мне, какую проверку оболочки скрипта я должен был бы выполнить (т. е. какой разбор) в "файле", чтобы проверить, есть ли Я могу выполнить программу ? Если такой тест слишком сложно сделать на общей основе, я бы, по крайней мере, хотел проверить, является ли это исполняемый файл linux или osX (Mach-O)
С верхней части моей головы, вы могли бы сделать что-то вроде этого в Баш:
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
в принципе, я запускаю тест, а затем, если это успешно, я делаю 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, вы должны быть в состоянии установить coreutils с homebrew и использовать
grealpath
.задание
isexec
функциивы можете определить функцию для удобства:
isexec() { if [[ -f "" && -x $(realpath "") ]]; then echo true; else echo false; fi; }
затем вы можете проверить с помощью:
if `isexec "$file"`; then ... fi