Проверьте, является ли файл исполняемым
Мне интересно, какой самый простой способ проверить, является ли программа исполняемой с помощью bash, без ее выполнения ? Он должен, по крайней мере, проверить, имеет ли файл права на выполнение и имеет ту же архитектуру (например, не исполняемый файл windows или другую неподдерживаемую архитектуру, а не 64 бита, если система 32 бита,...) как действующая система.
4 ответов
взгляните на различные тест операторы (это для самой тестовой команды, но встроенные тесты BASH и TCSH более или менее одинаковы).
Вы заметите, что -x 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
возвращает более одной строки. Вот что происходит на моем 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
команда возвращает разные выходные данные в зависимости от ОС. Однако слово executable
будет в исполняемых программах, и обычно архитектура тоже появится.
сравните выше с тем, что я получаю на своем Linux box:
$ 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
во всех трех, вы увидите слово executable
и архитектуре (x86-64
, i386
или SPARC
С 32-bit
).
дополнительное соглашение
большое спасибо, кажется, это путь. Прежде чем я отмечу это как свой ответ, не могли бы вы указать мне, какую проверку оболочки скрипта я должен был бы выполнить (т. е. какой синтаксический анализ) на "файле", чтобы проверить, Я могу выполнить программу ? Если такой тест слишком сложно сделать на общей основе, я хотел бы, по крайней мере, проверить, является ли это исполняемый файл 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
в основном, я запускаю тест, затем, если это успешно, я делаю grep на выходе . The 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