Погляньте на різні оператори тестування (це стосується самої команди тестування, але вбудовані тести 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 Script:
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)
Зверху в моїй голові ви можете зробити щось подібне в 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
команди можуть відрізнятися залежно від системи, тому вам доведеться перевірити, чи вони будуть працювати у вашій системі. Крім того, я перевіряю виконуваний біт. Якщо файл є двійковим виконуваним файлом, але виконуваний біт не ввімкнено, я скажу, що він не є виконуваним. Це може бути не те, що ти хочеш.