Tại sao tôi nhận được [[: không tìm thấy khi chạy tập lệnh?


14

Tôi đang cố gắng viết một tập lệnh phải kiểm tra xem một tập tin có tồn tại không. Trong bảng điều khiển tôi viết

if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

va tôi lây

not mod

nhưng khi tôi viết một kịch bản để làm điều tương tự:

#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

và sau đó thực thi kịch bản, tôi nhận được điều này:

./ex.sh: 2: [[: not found
mod

Tôi đã lưu tập lệnh trên thư mục hiện tại và đặt tên là ex.sh, sau đó tôi chắc chắn rằng nó có thể thực thi được. Để gọi kịch bản tôi làm điều này:

./ex.sh

Tại sao tôi nhận được vấn đề này? Tôi đã thử nhiều thứ:

if [ -a /home ...

if test -a /home ...

Cả hai trở về

13: -a: unexpected operator

Tôi đã có thể làm cho nó hoạt động, nhưng vì điều đó tôi đã phải xóa dòng đầu tiên (#! / Bin / sh) Bạn có biết tại sao điều này xảy ra không?
Buzu

thử#!/bin/bash
kev

xin chào kev, tôi cũng liên quan điều đó Tôi vừa cập nhật câu hỏi của tôi. Tôi đã dành quá nhiều thời gian cho việc này, nhưng tôi vui vì tôi có thể giải quyết nó. Cảm ơn câu trả lời của bạn. Nó thực sự là, giải pháp cho vấn đề.
Buzu

@Kev Xin vui lòng gửi câu trả lời
slhck

Buzu, @Kev - nếu bạn tìm thấy câu trả lời, hãy đăng nó dưới dạng câu trả lời bên dưới , đừng chỉnh sửa câu hỏi.
dùng1686

Câu trả lời:


9

Bạn đang chạy một tập lệnh được viết cho bash theo sh , thiếu nhiều tính năng cú pháp mở rộng - [[là một bashlệnh dựng sẵn và không có sẵn trong sh.

Thay đổi #!/bin/shthành #!/bin/bashhoặc thành #!/usr/bin/env bash.


Trên một số hệ thống, /bin/shlà một liên kết tượng trưng đến /bin/bash. Và nó có thể hợp lý an toàn để giả định rằng đó bash/bin/bash.
Keith Thompson

@Keith: Nó có /bin/bashtrên hầu hết các hệ thống Linux, nhưng /usr/pkg/bin/bashtrên BSD hoặc /usr/local/bin/bashnếu một trong số đó biên dịch trực tiếp từ nguồn.
dùng1686

@grawity: Hoặc bất cứ nơi nào khác bạn quyết định đặt nó nếu bạn biên dịch từ nguồn. Ok, điểm tốt. Cá nhân, tôi muốn chỉnh sửa shebang cho từng hệ thống hơn là sử dụng /usr/bin/envhack (sử dụng bất cứ điều bashgì xảy ra trong các cuộc gọi $PATHtại thời điểm này), nhưng YMMV. (Và bạn có thể tạo /bin/bashmột liên kết tượng trưng - nếu bạn có quyền quản trị viên và bạn không bận tâm đến việc gây rối /bin.)
Keith Thompson

@Keith: /usr/locallà nơi autotools quyết định đặt nó theo mặc định. Theo như "cá nhân", tôi thích có một số máy chủ và máy ảo khác nhau lấy từ cùng một kho lưu trữ tập lệnh / công cụ và không cần chỉnh sửa lại các shebang trên một nửa số đó sau mỗi lần xác nhận.
dùng1686

không ai trong số họ làm việc cho tôi: / im trên centos
astroanu

0

Chỉ định bash thay vì sh khi chạy tập lệnh. Cá nhân tôi nhận thấy chúng khác nhau dưới Ubuntu 12.10:

bash script.sh arg0 ... argn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.