2010-08-28 40 views
8

Tôi đang cố đọc các lệnh từ một tệp văn bản và thực thi từng dòng từ một tập lệnh bash.dòng lệnh exec từ tập tin trong bash

#!/bin/bash 
while read line; do 
    $line 
done < "commands.txt" 

Trong một số trường hợp, nếu $line chứa các lệnh mà có nghĩa là để chạy ở chế độ nền, ví dụ như command 2>&1 & họ sẽ không bắt đầu ở chế độ nền, và sẽ chạy trong bối cảnh kịch bản hiện hành.

Mọi lý do tại sao?

+3

Có một số lý do bạn không thể thực hiện "source commands.txt" thay vì viết vòng lặp của riêng bạn không? –

+0

"nguồn" làm gì? Tôi đang cố gắng kiểm tra nó ngay bây giờ – Quamis

+0

Vui lòng xem [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050). Và sau đó sử dụng 'nguồn' (hoặc' .') như Jim Lewis gợi ý. 'nguồn' thực hiện khá nhiều câu đầu tiên trong câu hỏi của bạn. –

Trả lời

7

nếu tất cả các lệnh của bạn nằm trong "commands.txt", về cơ bản, bạn có thể gọi nó là tập lệnh shell. Đó là lý do tại sao bạn có thể hoặc là nguồn, hoặc chạy nó như bình thường, tức là chmod u + x, sau đó bạn có thể thực hiện nó bằng cách sử dụng sh commands.txt

1

Tôi không có gì để thêm vào câu trả lời của ghostdog74 về cách đúng để thực hiện việc này, nhưng tôi có thể giải thích tại sao nó không thành công: Trình phân tích cú pháp chuyển hướng I/O, nền và một số thứ khác trước khi nó mở rộng biến, do đó, vào thời điểm $line được thay thế bằng command 2>&1 & đã quá muộn để nhận ra 2>&1&. so với tham số command.

Bạn có thể cải thiện điều này bằng cách sử dụng eval "$line" nhưng ngay cả ở đó bạn sẽ gặp sự cố với các lệnh nhiều dòng (ví dụ: khi vòng lặp, nếu chặn, v.v.). Các phương pháp sourcesh không có vấn đề này.

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