2012-04-25 30 views
45

Tôi tự hỏi cách dễ nhất để kiểm tra xem chương trình có thực thi với bash không thực thi nó không? Nó nên ít nhất là kiểm tra xem tập tin có thực thi quyền và có cùng kiến ​​trúc hay không (ví dụ, không phải là một cửa sổ thực thi hoặc kiến ​​trúc không được hỗ trợ khác, chứ không phải 64 bit nếu hệ thống là 32 bit, ...) làm hệ thống hiện tại.kiểm tra xem tệp có thể thực thi

+0

Tôi nghĩ rằng ls -la [filename] hoặc stat [filename] – ControlAltDel

+0

Cả ls -la lẫn stat đều không cung cấp thông tin về kiến ​​trúc được hỗ trợ, thực sự là một phần của câu hỏi mà tôi quan tâm nhất. một lỗi vì một tệp thực thi không được biên dịch cho kiến ​​trúc của tôi và tôi muốn tạo một tập lệnh để tránh điều đó trong tương lai. – bob

+1

@bob: Bạn đã thử kiểm tra đầu ra của tệp 'chạy trên các tệp đó chưa? – FatalError

Trả lời

71

Hãy xem các toán tử khác nhau test (điều này là dành cho lệnh kiểm tra, nhưng các thử nghiệm BASH và TCSH được xây dựng trong nhiều hoặc ít hơn).

Bạn sẽ nhận thấy rằng -x FILE nói TẬP_TIN tồn tại và quyền thực thi (hoặc tìm kiếm) được cấp.

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 hoặc CSH Script:

if (-x "$file") then 
    echo "File '$file' is executable" 
else 
    echo "File '$file' is not executable or found" 
endif 

Để xác định loại của tập tin đó là, hãy thử các lệnh file. Bạn có thể phân tích đầu ra để xem chính xác loại tệp đó là gì. Từ 'o Cảnh báo: Đôi khi file sẽ trả về nhiều dòng. Đây là những gì xảy ra trên máy Mac của tôi:

$ 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 

Lệnh file trả về đầu ra khác nhau tùy thuộc vào hệ điều hành. Tuy nhiên, từ executable sẽ có trong các chương trình thực thi và thường kiến ​​trúc cũng sẽ xuất hiện.

Hãy so sánh ở trên để những gì tôi nhận được trên Linux box của tôi:

$ 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 

Và một hộp Solaris:

$ file /bin/ls 
/bin/ls:  ELF 32-bit MSB executable SPARC Version 1, dynamically linked, stripped 

Trong cả ba, bạn sẽ thấy từ executable và kiến ​​trúc (x86-64, i386 hoặc SPARC với 32-bit).


Phụ Lục

Cảm ơn bạn rất nhiều, điều đó dường như con đường để đi. Trước khi tôi đánh dấu câu trả lời này là câu trả lời của tôi, bạn có thể hướng dẫn tôi về kiểu shell script mà tôi phải thực hiện (ví dụ, loại phân tích cú pháp) nào trên 'tệp' để kiểm tra xem tôi có thể thực thi chương trình không? Nếu một thử nghiệm như vậy là quá khó để thực hiện trên cơ sở chung, tôi sẽ ít nhất muốn kiểm tra xem đó là một thực thi linux hoặc osX (Mach-O)

. như thế này trong 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 

về cơ bản, tôi đang chạy thử nghiệm, sau đó nếu đó là thành công, tôi làm một grep trên đầu ra của lệnh file. Các grep -q có nghĩa là không in bất kỳ đầu ra, nhưng sử dụng mã thoát của grep để xem nếu tôi tìm thấy chuỗi. Nếu hệ thống của bạn không mất grep -q, bạn có thể thử grep "regex" > /dev/null 2>&1.

Một lần nữa, đầu ra của lệnh file có thể thay đổi từ hệ thống này sang hệ thống khác, vì vậy bạn sẽ phải xác minh rằng những điều này sẽ hoạt động trên hệ thống của bạn. Ngoài ra, tôi đang kiểm tra bit thực thi. Nếu một tệp là một tệp nhị phân có thể thực thi được, nhưng bit thực thi không được bật, tôi sẽ nói nó không thực thi được. Điều này có thể không phải là những gì bạn muốn.

+0

Bourne shell có '[[' hay chỉ '['? –

+2

@glennjackman Bourne shell chỉ có '[' mà thực sự là một lệnh bên ngoài, và không phải là một built-in của shell. Nó thường nằm trong thư mục '/ bin'. Đó là bí danh cho lệnh 'test'. –

+0

Cảm ơn bạn rất nhiều, đó dường như là cách để đi. Trước khi tôi đánh dấu câu trả lời này là câu trả lời của tôi, bạn có thể hướng dẫn tôi về kiểu shell script mà tôi phải thực hiện (ví dụ, loại phân tích cú pháp) nào trên 'tệp' để kiểm tra xem tôi có thể thực thi chương trình không? Nếu một thử nghiệm như vậy là quá khó để thực hiện trên cơ sở chung, tôi sẽ ít nhất muốn kiểm tra xem đó là một thực thi Linux hoặc OSX (Mach-O). – bob

5

Dường như không ai nhận thấy rằng nhà điều hành -x không khác với tệp có thư mục.

Vì vậy, để kiểm tra chính xác một tập tin thực thi, bạn có thể sử dụng [[ -f SomeFile && -x SomeFile ]]

2

Cũng dường như không ai để ý điều hành -x vào liên kết tượng trưng. Một liên kết tượng trưng (chuỗi) đến một tệp thông thường (không được phân loại là có thể thực thi) không thực hiện được phép thử.

Các vấn đề liên quan