2012-04-25 3 views
45

Мне интересно, что самый простой способ проверить, является ли программа исполняемой с помощью bash, без ее выполнения? Он должен по крайней мере проверить, имеет ли файл права выполнения и имеет одну и ту же архитектуру (например, не исполняемый файл Windows или другую неподдерживаемую архитектуру, а не 64 бита, если система 32 бита, ...) в качестве текущей системы.проверить, является ли файл исполняемым

+0

Я думаю, что либо ls -la [имя_файла], либо stat [имя_файла] – ControlAltDel

+0

Ни ls -la, ни stat не предоставляют информацию об поддерживаемой архитектуре, которая на самом деле является частью вопроса, который меня больше всего интересует. ошибка, потому что исполняемый файл не был скомпилирован для моей архитектуры, и я хотел бы создать сценарий, чтобы избежать этого в будущем. – bob

+1

@bob: Вы пробовали проверять вывод «файла» на эти файлы? – FatalError

ответ

71

Посмотрите на различные операторы test (это для самой тестовой команды, но встроенные тесты BASH и TCSH более или менее одинаковы).

Вы заметите, что -x FILE говорит, ФАЙЛ существует и разрешение на выполнение (или поиск) предоставляется.

BASH, Bourne, КШ, 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. Вы можете разобрать вывод, чтобы посмотреть, какой тип файла он имеет. 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 команда возвращает разный выход в зависимости от операционной системы. Однако слово 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 

Во всех трех, вы увидите слово executable и архитектуру (x86-64, i386, или SPARC с 32-bit).


Добавление

Большое спасибо, что кажется путь. Прежде чем отметить это как свой ответ, не могли бы вы посоветовать мне, какую проверку оболочки скрипта мне нужно выполнить (например, какой синтаксический анализ) на «файл», чтобы проверить, могу ли я выполнить программу? Если такой тест слишком трудно сделать на общей основе, я бы по крайней мере, хотел, чтобы проверить, является ли это Linux исполняемый файл или OSX (Mach-O)

Off верхней части моей головы, вы могли бы сделать что-то как это в 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 на выходе команды file. Значения grep -q не печатают никакого вывода, но используйте код выхода grep, чтобы узнать, нашел ли я строку. Если ваша система не принимает grep -q, вы можете попробовать grep "regex" > /dev/null 2>&1.

Опять же, вывод команды file может отличаться от системы к системе, поэтому вам нужно будет убедиться, что они будут работать в вашей системе. Кроме того, я проверяю исполняемый бит. Если файл является двоичным исполняемым файлом, но исполняемый бит не включен, я скажу, что он не является исполняемым. Возможно, это не то, что вы хотите.

+0

У Bourne shell есть '[[' или просто '['? –

+2

@glennjackman У оболочки Bourne есть '[', которая на самом деле является внешней командой, а не встроенной оболочкой. Обычно он находится в каталоге '/ bin'. Это псевдоним команды 'test'. –

+0

Большое спасибо, это похоже на путь. Прежде чем отметить это как свой ответ, не могли бы вы посоветовать мне, какую проверку оболочки скрипта мне нужно выполнить (например, какой синтаксический анализ) на «файл», чтобы проверить, могу ли я выполнить программу? Если такой тест слишком сложно сделать на общем основании, я бы по крайней мере хотел проверить, является ли это исполняемым файлом linux или osX (Mach-O). – bob

5

Похоже, что никто не заметил, что -x Оператор не отличается файлом с каталогом.

Так точно проверить исполняемый файл, вы можете использовать [[ -f SomeFile && -x SomeFile ]]

2

кажется Также никто не заметил -x оператор на симлинках. Символьная ссылка (цепочка) на обычный файл (не классифицируется как исполняемый файл) не проходит тест.

Смежные вопросы