2009-02-06 40 views
6

Ai đó có thể giúp giải thích như sau:Bash Scripting - vỏ lệnh đầu ra chuyển hướng

Nếu tôi gõ:

a=`ls -l` 

Sau đó, đầu ra của lệnh ls được lưu trong biến a

nhưng nếu tôi thử:

a=`sh ./somefile` 

Kết quả được đưa vào vỏ (stdout) thay vì biến số a

Điều tôi mong đợi là hoạt động kết quả của hệ vỏ cố thực hiện một đoạn 'somefile' được lưu trữ trong biến.

Hãy chỉ ra những gì sai với sự hiểu biết của tôi và một cách có thể để làm điều này.

Cảm ơn.

EDIT:

Chỉ cần làm rõ, kịch bản 'somefile' có thể hoặc không tồn tại. Nếu nó tồn tại sau đó tôi muốn đầu ra của tập lệnh được lưu trữ trong 'a'. Nếu không, tôi muốn thông báo lỗi "không có tệp hoặc thư mục" được lưu trữ trong 'a'

Trả lời

15

Tôi nghĩ rằng vì trình bao có thể tự gắn vào/dev/tty nhưng tôi có thể sai. Tại sao bạn không chỉ cần thiết lập quyền thực thi trên kịch bản và sử dụng:

a=`./somefile` 

Nếu bạn muốn chụp stderr thiết bị xuất chuẩn để một, chỉ cần sử dụng:

a=`./somefile 2>&1` 

Để kiểm tra tập tin được thực thi đầu tiên:

if [[ -x ./somefile ]] ; then 
    a=$(./somefile 2>&1) 
else 
    a="Couldn't find the darned thing." 
fi 

và bạn sẽ nhận thấy tôi đang chuyển sang phương thức $() thay vì backticks. Tôi thích $() vì bạn có thể lồng chúng (ví dụ: "a=$(expr 1 + $(expr 2 + 3))").

+0

không phải về quyền ... tôi muốn các thông báo lỗi hoặc trả lại giá trị được lưu trữ trong biến. –

+0

Điều tôi đang nói là bạn không cần chạy sh để chạy kịch bản (và sh sẽ áp đặt tường lửa của riêng nó trên đầu ra nếu bạn làm). Chỉ cần chạy kịch bản trực tiếp và, cho rằng, bạn cần phải 'chmod + x' nó. – paxdiablo

+0

Hãy thử các cách sau: "chmod u + x somefile; a ='. – paxdiablo

5

Bạn có thể thử cách thay thế lệnh mới và cải tiến, sử dụng $() thay vì backticks.

a=$(sh ./somefile) 

Nếu nó vẫn không hoạt động, kiểm tra xem somefile không phải là thực sự stderr 'ing.

+0

tôi đã thử và nó không hoạt động ... –

+0

có thể nó không thực sự tìm thấy một số tập tin;) – Bogdan

2

Bạn chính xác, tiêu chuẩn của ./somefile được lưu trữ trong biến a. Tuy nhiên, tôi giả định một số kết quả đầu ra cho stderr. Bạn có thể chuyển hướng với 2>&1 trực tiếp sau ./somefile.

+0

oh tôi nghĩ rằng tôi thấy, do đó, đầu ra trong trường hợp 'somefile' doesnt exsists được lưu trữ trong một là gì, nhưng kịch bản theo mặc định chuyển hướng đến stderr đó là lý do tại sao tôi thấy thông báo lỗi trên màn hình như trái ngược với được lưu trữ trong biến? –

+1

Không các stdout của * sh * được lưu trữ trong một, sh không phải là đi qua stdout của ./somefile trở lại người gọi của nó. – paxdiablo

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