2012-12-19 3 views
6

[lineux device drivers] adlı kitapta bu komut satırını okudum. Herkesin ne yaptığını açıklamasına yardımcı olabilir (belki de birkaç kelime detaylı olarak)? bağlamında olduğu gibiBu shell script satırının anlamı awk ile

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

, yak. Bu senaryodaki çizgilerin en az yarısı, her birinde en az bir hataya sahiptir ve awk kullanmaya başlaması çok saçmadır. –

+0

@EdMorton bir yedek kitap önermek ... –

+0

Kabuk için: Chris Johnson tarafından Kabuk Scripting Tarifler. Awk için: Arnold Robbins tarafından etkili Awk Programlama. –

cevap

2

Bunu da okudum ama bu hat benim için çalışmıyordu. Ben ilk bölümü \$2 == \"$module\" kalıptır

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

bunu değiştirmek zorunda kaldı. Bu tatmin olduğunda, yani ikinci sütun "kürek" e eşittir, ilk sütunu basan print \$1 komutu çalıştırılır. Bu değer, büyük değişkende saklanır. $, awk olarak geçirilmeleri gerektiği için kaçmak zorundadır.

+0

Hayır! Bunun doğru cevap olarak kabul edildiğine inanamıyorum! @Guru –

+0

@EdMorton tarafından verilen doğru cevaba bakın, verilen kodun yanlış bir açıklaması değildir, bu yüzden sorun değil. – cmh

+1

@ cmh - Bu bana Seattle'daki siste kaybolan adamın şakasını anımsattı, bu yüzden bir binaya çekti ve nerede olduğunu ve aldığının cevabının "arabada" olduğunu sordu. Bu bilgi verildikten sonra, evinin yolunu bulabildiğini bildiği gibi, tam olarak doğru ve tam anlamıyla işe yaramaz bir cevap aldığı için, Microsoft binasında olması gerektiğini biliyordu. Buggy kodunu düzeltmeden yorumlamak yararlı IMHO değildir. –

1

/proc/devices her modül için şu anda yapılandırılmış bir karakter ve bir blok aygıtları içerir.

sizin bağlamda birkaç değişken genişletilmesi ve eşitlik içinde sözdizimi hatasının düzeltilmesi, komut aşağıdaki gibidir: İkinci sütunun değeri daha sonra, çıkış scull ise

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

Bu" anlamına gelir ilk sütun."

Bu komut bir alt kabukta çalıştırılır - $(...) - ve çıktı $major değişkenine atanır.

amaç açıklama in the book geçerli:

komut sırayla /proc/devices itibaren, bu nedenle, bilgileri almak için bir araç gibi awk kullanılarak yazılabilir dinamik bir numara atanmış bir modülü yüklemeye dosyaları /dev'da oluşturmak için.

the distributed examples'da, scull_load'daki satırın Vivek'in düzeltmesiyle uyumlu olduğunu unutmayın.

+0

teşekkürler cbuckley, çok kapsamlı bir cevap. – user1559625

7

bu olurdu yazmak için daha iyi bir yolu: Bunu okumak ne olursa olsun kitap

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

+1 Benzer bir şey yazıyordum. Bu, kabuk varyasyonlarını awk'ye iletmenin doğru yoludur. – Steve

+0

@Guru bilmek güzel ve daha temiz. – user1559625

+0

+1 Neredeyse doğru, sadece kabuk değişkeninizi belirtin: 'mod =" $ module "'. –