2012-07-27 36 views
6

Tôi có một tình huống trong đó có lệnh trong tập lệnh shell phải được thực hiện sau khi lệnh thoát xuất hiện được thực thi trong cùng một tập lệnh () tôi biết !! nghe có vẻ điên !!)Shell script: Thực hiện lệnh sau khi chạy lệnh "thoát" trong kịch bản lệnh

tôi muốn tìm một giải pháp cho một cái gì đó giống như

#!/bin/sh 
ls -l ~/. 
exit $? 
touch ~/abc.txt 

Ở đây tôi muốn lệnh touch ~/abc.txt thực hiện sau khi exit $? đã chạy và lệnh touch ~/abc.txt có thể bất kỳ lệnh nào.

Ràng buộc: 1) Tôi không thể sửa đổi phần exit $? của tập lệnh ở trên. 2) Lệnh phải được thực hiện chỉ sau lệnh exit $?.

Tôi không chắc chắn nếu có giải pháp cho việc này nhưng mọi trợ giúp đều được đánh giá cao.

+0

Có thể chúng tôi biết tại sao bạn không thể sửa đổi những dòng đầu tiên đó? – arkascha

+0

Xin lỗi !! Tôi đã chỉnh sửa phần ràng buộc của câu hỏi của tôi ngay bây giờ. Tôi có thể thay đổi bất cứ điều gì trong kịch bản nhưng lệnh thoát phải ở lại !! – latestVersion

+0

Nếu bạn không thể sửa đổi tập lệnh, bạn muốn thêm lệnh 'touch' như thế nào? Nếu bạn _can_ sửa đổi kịch bản, tại sao bạn không thể thêm nó ở trên 'thoát'? – Shahbaz

Trả lời

10

Cách tiếp cận điển hình là để thiết lập một cái bẫy:

trap 'touch ~/abc.txt' 0 

này sẽ gọi lệnh liên lạc khi thoát khỏi vỏ. Trong một số hệ vỏ (ví dụ bash), bẫy cũng sẽ được thực hiện nếu tập lệnh kết thúc dưới dạng kết quả của một tín hiệu, nhưng trong các kịch bản khác (ví dụ: dash) nó sẽ không. Không có cách di động để gọi lệnh chỉ khi lệnh cuối cùng là exit.

+0

Cảm ơn bạn !! Điều này có ích. – latestVersion

0

Tôi nghi ngờ cách trực tiếp là có thể theo bất kỳ cách nào.

Nhưng có thể có cách giải quyết: bạn có thể bao bọc tập lệnh thực thi trong một quy trình khác không? Sau đó, bạn có thể gọi bất cứ điều gì bạn muốn trong kịch bản gói một khi kịch bản gói thực thi lối ra của nó() và được loại bỏ khỏi ngăn xếp.

1

Tôi không biết tại sao bạn muốn làm một cái gì đó như thế nhưng có thể thử một cái gì đó như thế này: bọc kịch bản của bạn trong một số khác. Trong kịch bản cha mẹ của bạn đánh giá kịch bản con của bạn với lệnh như eval hoặc source, sau đó trích xuất từ ​​kịch bản con lệnh cuối cùng của bạn và thực hiện nó một cách riêng biệt cùng một cách.

+0

+1: Bí quyết khai thác giúp câu trả lời này tốt hơn câu trả lời của tôi. – arkascha

+0

Nhiều như tôi muốn, tôi không thể sử dụng một trình bao bọc trên tập lệnh của mình khi tôi đang sửa đổi kịch bản "tcruntime-ctl.sh" của vFabric tcServer. – latestVersion

+0

Tôi nhất định chỉ sửa đổi tập lệnh này ngay bây giờ! : ( – latestVersion

0

Điều này sẽ hiệu quả, ngay cả khi OP không muốn di chuyển lối ra.

#!/bin/sh 
ls -l ~/. 
RES=$?  #save res for later. 
touch ~/abc.txt 
exit $RES 
Các vấn đề liên quan