2012-12-19 35 views
6

Tôi đọc dòng lệnh này trong sách [trình điều khiển thiết bị linux]. Bất cứ ai có thể giúp giải thích những gì nó làm (có thể một vài từ chi tiết)?Ý nghĩa của dòng lệnh shell này với awk

major=$(awk "\\$2= =\"$module\" {print \\$1}" /proc/devices) 

như trong bối cảnh:

#!/bin/sh 
module="scull" 
device="scull" 
mode="664" 

# invoke insmod with all arguments we got 
# and use a pathname, as newer modutils don't look in . by default 

/sbin/insmod ./$module.ko $* || exit 1 


# remove stale nodes 
rm -f /dev/${device}[0-3] 

major=$(awk "\\$2= =\"$module\" {print \\$1}" /proc/devices) 

mknod /dev/${device}0 c $major 0 
.... 
+1

Dù cuốn sách bạn đọc rằng trong, đốt cháy nó. Ít nhất một nửa số dòng trong tập lệnh đó có ít nhất một lỗi trên mỗi dòng và cách nó gọi awk chỉ là vô lý. –

+0

@EdMorton vui lòng đề nghị một cuốn sách thay thế ... –

+0

Đối với shell: Shell Scripting Recipes của Chris Johnson. Đối với awk: Lập trình Awk hiệu quả của Arnold Robbins. –

Trả lời

2

Tôi đã đọc dòng này quá nhưng dòng đó không hoạt động đối với tôi. Tôi phải sửa đổi nó thành

major=$(awk "\$2 == \"$module\" {print \$1}" /proc/devices) 

Phần đầu tiên \$2 == \"$module\" là mẫu. Khi điều này được thỏa mãn, tức là cột thứ hai bằng "scull", lệnh print \$1 được thực hiện để in cột đầu tiên. Giá trị này được lưu trữ trong biến lớn. Các $ cần phải được thoát khi chúng cần phải được thông qua vì nó là để awk.

+0

Không !!! Tôi không thể tin rằng điều này được chấp nhận là câu trả lời đúng! Xem câu trả lời đúng của @Guru –

+0

@EdMorton nó không phải là một lời giải thích không chính xác của mã như được đưa ra, vì vậy nó là tốt. – cmh

+1

@cmh - điều đó nhắc tôi nhớ đến câu chuyện về anh chàng bị lạc trong sương mù ở Seattle nên anh ta kéo đến một tòa nhà và hỏi anh ta ở đâu và câu trả lời anh ta nhận được là "trong xe hơi". Với thông tin đó, anh ta có thể tìm đường về nhà khi biết rằng vì anh ta chỉ có một câu trả lời hoàn toàn đúng và hoàn toàn vô dụng nên anh ta phải ở trong tòa nhà của Microsoft. Phiên dịch mã lỗi mà không sửa nó không phải là IMHO hữu ích. –

1

/proc/devices chứa các nhân vật và ngăn chặn các thiết bị hiện cấu hình cho mỗi mô-đun.

Mở rộng một vài biến trong bối cảnh của bạn, và sửa chữa các lỗi cú pháp trong sự bình đẳng, lệnh trông như thế này:

awk '$2=="scull" {print $1}' /proc/devices 

này có nghĩa là "nếu giá trị của cột thứ hai là scull, sau đó sản lượng Cột đầu tiên."

Lệnh này được chạy trong một vỏ con - $(...) - và đầu ra được gán cho biến $major.

Lời giải thích của mục đích là in the book:

Các kịch bản để tải một mô-đun đã được gán một số động có thể, do đó, được viết bằng một công cụ như awk để lấy thông tin từ /proc/devices theo thứ tự để tạo các tệp trong /dev.

Lưu ý rằng trong the distributed examples, dòng trong scull_load khớp với hiệu chỉnh của Vivek.

+0

cảm ơn cbuckley, câu trả lời rất kỹ lưỡng. – user1559625

7

Cách tốt hơn để viết những dòng này sẽ là:

major=$(awk -v mod=$module '$2==mod{print $1}' /proc/devices) 
+0

+1 Tôi vừa viết một cái gì đó tương tự. Đây là cách chính xác để vượt qua các shell shell để awk. – Steve

+0

@Guru tốt để biết, và nó sạch hơn. – user1559625

+0

+1 Hầu như chính xác, chỉ cần báo giá biến shell của bạn: 'mod =" $ module "'. –

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