Boruların yanındaki boşluklar


17

Gördüm history | grep blahve history |grep blah; ve history|grep blahhiç kimse kullanmıyor gibi görünse de çalışır.

Boşluklarda herhangi bir önem var mı (örn. Farklı komutlara / komutlarından boru tesisatı, boşlukların farklı kullanımını gerektirir) veya her zaman keyfi midir?


13
Daha çok okunabilirlik.
jasonwryan

1
|boru veya ;noktalı virgül çoğu kabuk tarafından (bash, ksh, tcsh) komutların ayırıcısı olarak kullanılır. alıntıda kapalı olmadığında beyaz boşluk önce ve sonra saygısızdır.
Archemar

Yanıtlar:


24

bashçeşitli metakarakterleri tanımlar . Gönderen man bash:

metakarakter Alıntılama yapılmadığında
sözcükleri ayıran bir karakter. Aşağıdakilerden biri:
| &; () <> boşluk sekmesi

Meta karakterler karakterleri ayırdığından, boşluklarla çevrilip çevrilmedikleri önemli değildir. Boru sembolü, |bir metakarakterdir ve bu nedenle, fark ettiğiniz gibi, çevresinde boşluklara ihtiyaç duymaz.

Not [, ], {, }, ve =vardır değil meta. Aksine, anlamları, boşluklarla çevrilip çevrilmediklerine güçlü bir şekilde bağlıdır.

Boşluğun gerekli olduğu ve gerekmediği örnekler

Fark ettiğiniz gibi, |boşluklarla çevrili olup olmadığı önemli değil . Bash kullanıcılarını sıkça karıştıran bazı örnekleri ele alalım. Düşünmek:

$ (date)
Sun Mar  1 12:47:07 PST 2015

Yukarıdaki parens, datekomutun bir alt kabukta çalıştırılmasını zorunlu kılar. Çünkü (ve )meta karakter olan, boşluk ihtiyaç vardır. Aksine:

$ {date}
bash: {date}: command not found

Yana {ve }vardır değil meta, kabuk davranır {date}tek bir kelime olarak. dateKomutu aramak yerine, adlı bir komutu arar {date}. Birini bulamadığı için bir hata oluşur.

Başka bir yaygın sorun testkomuttur. Aşağıdakiler başarıyla çalışır:

$ [ abc ] && echo Yes
Yes

Boşlukları kaldırdığınızda bir hata oluşur:

$ [abc] && echo Yes
bash: [abc]: command not found

Çünkü [ve ]vardır değil meta, kabuk muamele [.bashrc]sadece gibi tek bir kelime ve sonuç olarak, dateörneğin, bir hatadır.

Atama ifadeleri de boşluklara duyarlıdır. Aşağıdaki atama başarılı:

$ v=date
$ echo $v
date

Boşluk ekleyin, ödev başarısız olur:

$ v= date
Sun Mar  1 12:55:05 PST 2015

Yukarıda, kabuk geçici olarak boşalmaya ayarlanır vve sonra datekomutu yürütür .

Daha önce boşluk eklemek =de başarısızlığa neden olur, ancak farklı bir nedenden dolayı:

$ v =date
bash: v: command not found

Burada, kabuk vargümanı ile komutu yürütmeye çalışır =date. Hata, adlandırılmış bir komut bulamamasıdır v.


1
Kısa bir süre önce görevlendirmenin ifadesine kurban düştüm. Önce ve sonra boşluklar vardı =. Hata ayıklamak için biraz zaman aldı.
topher

3

Borular , bir programın çıktısını başka bir programın girişi olarak kullanmanızı sağlar ...

Alanlara gelince, sadece okunabilirlik meselesi / @jasonwryan gibi personel tercihi söz konusudur.

"|" Öncesi ve sonrası bir boşluk çubuğu normdur ....

Ayrıca, sadece bir astarınızı değil, aynı zamanda çıktınızı da yapmak için -t sütunu ile kullanabilirsiniz.

lnydex99uhc:depot_r user$ lsof | grep my | column -t
Microsoft  290  user  txt  REG  1,4  9515016  170972    /Library/Fonts/PCmyoungjo.ttf
bash       359  user  cwd  DIR  1,4  714      12246074  /Users/zatef/hw2/base/active/myapp

2

Boşluk kullanmamanın yararlı olabileceği bir durum vardır. ABD-Amerikan düzeni kullanmıyorsanız AltShiftL, kanal girmek gibi bazı kombinasyonları kullanmak zorunda kalabilirsiniz . Bu kendi başına bir sorun olmasa da, bunun bir sonucu, bazen bu karakterden önce veya sonra yazdırılmayan karakterler de girmenizdir. Örneğin, bir Fransız Macbook Pro klavyede AltShiftLgiriş yapmak için kullanmalıyım |. Hızlı bir şekilde yazdığınızda, yanlışlıkla şunu yazabilirsiniz: AltShift( L, Space)

$ sudo dmesg | tail
zsh: command not found:  tail

echo "sudo dmesg | tail" | od -a
0000000    s   u   d   o  sp   d   m   e   s   g  sp   |         t   a
0000020    i   l  nl

Eğer farkında değilseniz AltShiftSpacegirişler farklı bir boşluk (bölünemez boşluk ( U + 00A0 )), aşağıdaki hata anlamak zor olabilir:zsh: command not found:  tail


1

Bu durumda mekanların tek önemi estetiktir.
Başka bir deyişle, komutları bir insan için daha okunabilir hale getirmek yararlıdır.

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.