2012-10-24 24 views
6

Tôi đang viết một trình bao bọc bash để tìm hiểu một số khái niệm kịch bản. Ý tưởng là viết một kịch bản trong bash và đặt nó làm vỏ của người dùng khi đăng nhập.SIGINT để hủy đọc trong tập lệnh bash?

Tôi đã tạo một khoảng thời gian là read s và eval s đầu vào của người dùng và sau đó nhận thấy rằng bất cứ khi nào người dùng nhập CTRL + C, tập lệnh bị hủy bỏ để phiên người dùng kết thúc.

Để tránh điều này, tôi bị mắc kẹt SIGINT, không làm gì trong bẫy.

Bây giờ, vấn đề là khi bạn nhập CTRL + C ở một nửa lệnh, nó sẽ không bị hủy như một trong những điều sẽ làm trên bash - nó chỉ bỏ qua CTRL + C.

Vì vậy, nếu tôi nhập ping stockoverf^Cping stackoverflow.com, tôi nhận được ping stockoverfping stackoverflow.com thay vì ping stackoverflow.com mà tôi muốn.

Có cách nào để làm điều đó không?

#!/bin/bash 

# let's trap SIGINT (CTRL + C) 
trap "" SIGINT 

while true 
do 
    read -e -p "$USER - SHIELD: `pwd`> " command 
    history -s $command 
    eval $command 
done 

Trả lời

3

Bạn có thể sử dụng một công cụ như xdotool để gửi Ctrl-A (bắt đầu-of-line) Ctrl-K (xóa-to-end-of-line) Return (để dọn dẹp đường)

#!/bin/bash 
trap "xdotool key Ctrl+A Ctrl+k Return" SIGINT; 
unset command 
while [ "$command" != "quit" ] ;do 
    eval $command 
    read -e -p "$USER - SHIELD: `pwd`> " command 
    done 
trap SIGINT 

Nhưng tôi mạnh mẽ mời các bạn RTFM ... Trong tìm kiếm cho '' từ khóa '' debug ...

man -Pless\ +/debug bash 
+0

xdotool sẽ làm các trick, như 100% hack. Bạn nhận được một^^ C^A^K' và một dòng trống sẽ không hiển thị trong bash thuần túy (chỉ '^ C'), nhưng nó tốt hơn không có gì. Dù sao, nó sẽ là tuyệt vời để không phụ thuộc vào 'xdotool', và để tránh những đánh dấu thêm - nói, làm cho nó giống như bash hoạt động. Dù sao, tôi đã không nhận được lời mời rtfm ... Điều gì sẽ gỡ lỗi cho tôi thấy? – mgarciaisaia

+0

Vâng, đây là một hack lớn. Nhưng trong tiểu bang, điều này làm công việc. Cách đúng đắn để làm theo ý tưởng ban đầu cần truy cập các bộ mô tả tập tin thông qua ioctl. –

+0

@mgarciaisaia Về những gì * debug * có thể thực hiện và cách nó có thể được sử dụng. xem [profiling bash in nano giây] (http://stackoverflow.com/a/20855353/1765658) –

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