awk

2012-12-19 14 views
6

के साथ इस शेल स्क्रिप्ट लाइन का अर्थ पुस्तक [लिनक्स डिवाइस ड्राइवर] में मैंने स्क्रिप्ट की इस पंक्ति को पढ़ा है। क्या कोई यह समझाने में मदद कर सकता है कि यह क्या करता है (शायद कुछ शब्द विस्तार से)?awk

major=$(awk "\\$2= =\"$module\" {print \\$1}" /proc/devices) 
संदर्भ में

:

#!/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

जो भी किताब आप पढ़ सकते हैं कि में, इसे जला। उस स्क्रिप्ट में कम से कम आधे लाइनों में से प्रत्येक पर कम से कम एक बग है और जिस तरह से यह अजीब बात कर रहा है वह हास्यास्पद है। –

+0

@EdMorton कृपया एक प्रतिस्थापन पुस्तक का सुझाव दें ... –

+0

शैल के लिए: क्रिस जॉनसन द्वारा शैल स्क्रिप्टिंग व्यंजनों। अजीब के लिए: अर्नोल्ड रॉबिन्स द्वारा प्रभावी अवी प्रोग्रामिंग। –

उत्तर

2

मैंने इसे भी पढ़ा लेकिन वह लाइन मेरे लिए काम नहीं कर रही थी। मुझे इसे

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

पहला भाग \$2 == \"$module\" पैटर्न था। जब यह संतुष्ट होता है, यानी, दूसरा कॉलम "स्कुल" के बराबर होता है, तो print \$1 कमांड को निष्पादित किया जाता है जो पहले कॉलम को प्रिंट करता है। यह मान परिवर्तनीय प्रमुख में संग्रहीत है। $ से बचने की जरूरत है क्योंकि उन्हें गुजरना होगा क्योंकि यह अजीब है।

+0

नहीं !!! मुझे विश्वास नहीं है कि यह सही जवाब के रूप में स्वीकार किया गया था! @Guru –

+0

@EdMorton द्वारा सही उत्तर देखें, यह दिए गए कोड का गलत स्पष्टीकरण नहीं है, इसलिए यह ठीक है। – cmh

+1

@ सीएमएच - जो मुझे सिएटल में धुंध में खोने वाले लड़के के बारे में मजाक की याद दिलाता है, इसलिए वह एक इमारत तक खींच गया और पूछा कि वह कहां था और वह जवाब "कार में" था। उस जानकारी को देखते हुए वह घर जा सकता था क्योंकि वह जानता था कि चूंकि उसे अभी बिल्कुल सही और पूरी तरह से बेकार जवाब मिला है, वह माइक्रोसॉफ्ट बिल्डिंग में होना चाहिए। इसे सुधारने के बिना बग्गी कोड का व्याख्या करना उपयोगी IMHO नहीं है। –

1

/proc/devices प्रत्येक मॉड्यूल के लिए वर्तमान में कॉन्फ़िगर चरित्र और ब्लॉक उपकरणों में शामिल है।

अपने संदर्भ में कुछ चर का विस्तार, और समानता में सिंटेक्स त्रुटि फिक्सिंग, आदेश इस तरह दिखता है:

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

इसका मतलब यह है "अगर दूसरे स्तंभ के मान scull, उत्पादन होता है तो पहला कॉलम। "

यह आदेश एक सबहेल में चलाया गया है - $(...) - और आउटपुट को $major परिवर्तनीय को असाइन किया गया है।

उद्देश्य की व्याख्या in the book है:

स्क्रिप्ट एक मॉड्यूल इसी क्रम में /proc/devices से एक गतिशील संख्या सौंपा गया है, इसलिए, जानकारी पुनः प्राप्त करने के लिए एक उपकरण के रूप में awk का उपयोग कर लिखा जा सकता है लोड करने के लिए /dev में फ़ाइलों को बनाने के लिए।

ध्यान दें कि the distributed examples में, scull_load में लाइन विवेक के सुधार से मेल खाती है।

+0

धन्यवाद cbuckley, बहुत गहन जवाब। – user1559625

7

एक बेहतर तरीका यह होगा लिखने के लिए:

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

+1 मैं बस कुछ इसी तरह लिख रहा था। अजीब के लिए खोल युद्धों को पारित करने का यह सही तरीका है। – Steve

+0

@ गुरू जानना अच्छा है, और यह क्लीनर है। – user1559625

+0

+1 लगभग सही है, बस अपना खोल चर उद्धरण दें: 'mod = "$ module" '। –