Bir betiği dağıtma: / bin / gawk veya / usr / bin / gawk'u shebang için mi kullanmalıyım?


12

Gawk genellikle / bin veya / usr / bin içinde mi? Ben giderdim #!/usr/bin/env gawkama sonra argümanları kullanamam. Şimdi kullanıyorum #!/bin/gawk -f. Senaryo çok uzun ve çok sayıda tek tırnak içeriyor ve stdin ile çalışıyor.

GNU Awk kılavuzunda 1.1.4 Yürütülebilir awk Programları , örneğinde #! / Bin / awk kullandığı, ancak şöyle devam ettiği bölümler vardır:

İn yerine birçok sistemde awkbulunabileceğini unutmayın . Uyarıcı Emptor./usr/bin/bin

Çoğu insan ne yapar? Ben sed sed sözde / bin standartlaştırılmış iken perl sözde / usr / bin (sed bağlantı ile aynı sayfa ama onlar bu yazı için üçüncü bir bağlantı yapmak izin vermez) standartlaştırılmış okudum . Awk / gawk ne olacak? Hangisinin daha yaygın veya popüler olduğunu bilen var mı?


Neden kullanıyorsun -f? Değil mi /bin/gawkyeterli? Ayrıca, bu ilgili olabilir.
terdon

Yanıtlar:


7

Shebang bu kadar esnek olmak istemiyordu . İkinci bir parametrenin işe yaradığı bazı durumlar olabilir , bence FreeBSD bunlardan biri.

gawk ve işletim sistemi ile birlikte gelen çoğu yardımcı programın içinde olması bekleniyor /usr/bin/.

Daha eski UNIX günlerinde, /usr/yerel disk alanından ve iş istasyonu başına maliyetten tasarruf etmek için NFS veya daha ucuz bir ortama monte etmek yaygındı . tek kullanıcı modunda/bin/ önyükleme yapmak için gereken her şeye sahip olması gerekiyordu . Yana güvenilir medya üzerine monte değildi, genel yönetim ve sorun giderme için dost yeterince yapmak için yeterli araçları dahil./usr//bin/

Bu başlangıçta Linux'ta devralındı, ancak disk alanı artık bir sorun olmadığından ve çoğu durumda /usr/kök dosya sisteminde olduğundan, mevcut eğilim her şeyi /usr/bin(en azından Linux dünyasında) taşımaktır . Bir dağıtım tarafından kurulan çoğu yardımcı programın orada bulunması bekleniyor. Hatta en temel kamu hizmetleri gibi cp, rm, lsvb (iyi, daha değil).

Mesele seçimi ile ilgili. Geleneksel olarak bu, yöneticilerin veya kullanıcıların ortamlarına göre düzenlemek zorunda oldukları bir şeydir. Bir geliştirici başkalarının sistemlerinde, bilen herkes için, tercüman yerde dosya sisteminde olabilir (örneğin /usr/local/bin, /opt/gawk-4.0.1/bin). Düzgün bir şekilde paketlenmiş komut dosyaları (rpm, deb vb.) Dağıtım paketine bağımlıdır (yani, yorumlayıcının bilinen bir yeri vardır) veya yükleme sırasında uygun karmayı ayarlayan bir yapılandırma komut dosyası bulunur.


14

Komuta argümanlar iletmeniz gerekmiyorsa #!/usr/bin/env gawk, gitmenin yolu budur, ancak birçok çekirdek (Linux dahil), shebang programlarına sadece tek bir argümanı kabul eder.

Aksi takdirde, hem bir kabuk sarmalayıcı hem de awk betiği olan bir çokgenli program yapabilirsiniz . İşte awk için bir tane.

#!/bin/sh
true + /; exec gawk -f "$0"; exit; / {}
# awk script starts here

Kabuk ayrıştırma:

  • true + /;- trueiki eylemsiz argüman olan komut (hiçbir şey yapmaz) +ve /.
  • Çağrı gawk. Bu, yeni satır içermeyen ve eğik çizgilerin yazıldığı herhangi bir kabuk snippet'i olabilir \/(kabuk, iç tırnak işaretleri dışında sakıncası yoktur).
    Çağrı, execalt işlem olarak gawk yürütmek yerine kabuğun gawk ile değiştirilmesini kullanır .
  • exit;- gawk bulunamadığı takdirde kabuktan çıkın. Bundan sonraki her şey göz ardı edilir, ancak kabuğun yürütülmeye başlamadan önce tüm satırı ayrıştırmaya çalışması durumunda geçerli kabuk sözdizimi olması gerekir.

Awk ayrıştırma:

  • Eğik çizgiler arasındaki bit normal bir ifadedir.
  • true + /REGEX/- bir durum. truetanımlanmamış bir değişkendir, bu nedenle sayısal değeri önemli değildir, sayısal değeri 0'dır.
  • {} - Eğer söz konusu koşul devam ediyorsa, hiçbir şey yapmayın.

5

Gilles'in önerdiği çözüm gerçekten çok iyi bir yaklaşımdır (nihayetinde görevinde oy verme ünü var :)).

Her halükarda, execkomutu anladığım kadarıyla exit, kabuk sürecinin yerini aldığı için gereksiz, aslında ulaşılamaz olanı sağdan yapar awk.

Ayrıca, awkkomut dosyasının çağırma parametrelerine erişmesine izin vermek için , önerilen çözümde bazı değişiklikler önerebilirim:

#!/bin/sh
true + /; exec -a "$0" gawk -f "$0" -- "$@"; / {}
# awk script starts here

-a "$0"Aksi takdirde her zaman alacak, onun çağırma adı erişmesini senaryoyu verir awkya gawkerişirken ARGV[0]değişkeni. Benzer şekilde, "$@"komut dosyasının ARGV[1...N]dizideki kalan parametrelere erişmesine izin verir ve bundan --önce komut dosyasının -<something>gawk bunları yorumlamadan argüman almasına izin verir .

Hatırlanması / dikkate alınması gereken bir şey , kod programının bloğunun exit(0);sonuna bir ifade eklemektir , aksi takdirde betiğe girdi dosyaları olarak geçirilen tüm parametreleri tehdit eder. (Satırdan kaldırdığımız ifade ile hiçbir şey yapamayacağını lütfen unutmayın, bu önerilen çıkış awk kodundayken bu erişilemez bir kabuk ifadesi idi).BEGIN { ... }awkawkexittrue + ...


exit(0)Çok faydalı oldu! Ayrıca, macos kullanıcıları için bu özete bakın: İyi bir taşınabilir awk shebang bulmak kolay değildir.
Seamus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.