Kabuğun kontrol ve yönlendirme operatörleri nelerdir?


245

Sık sık farklı sembollerle farklı komutları birbirine bağlayan çevrimiçi öğreticiler görüyorum. Örneğin:

command1 |  command2
command1 &  command2
command1 || command2    
command1 && command2

Diğerleri komutları dosyalara bağlamak gibi görünüyor:

command1  > file1
command1  >> file1

Bunlar ne? Onları nasıl çağırıyorlar? Onlar ne yapar? Dahası var mı?


Bu soru hakkında meta iplik. .

Yanıtlar:


340

Bunlara kabuk operatörleri denir ve evet, onlardan daha fazlası vardır. İki ana sınıf, kontrol operatörleri ve yönlendirme operatörleri arasında en yaygın olanları ve bash kabuğuna göre nasıl çalıştıklarını kısaca anlatacağım.

A. Kontrol operatörleri

Kabuk komut dilinde, bir kontrol işlevi gerçekleştiren bir belirteç.
Aşağıdaki sembollerden biridir:

&   &&   (   )   ;   ;;   <newline>   |   ||

Ve |&bash olarak.

Bir !olduğu değil bir kontrol operatörü ama Ayrılmış Kelime . Aritmetik İfadeler ve test yapıları içinde (hala bir boşluk sınırlayıcı gerektirirken) mantıklı bir NOT [olumsuzlama operatörü] olur .

A.1 Liste sonlandırıcılar

  • ; : Birinin sonucuna bakılmaksızın, bir başkasının bitirmesinden sonra bir komutu çalıştıracak.

    command1 ; command2

    Birincisi command1, ön planda çalıştırılır ve bittikten command2sonra çalıştırılır.

    Bir dizgede değişmez veya belirli anahtar kelimelerin ardındaki yeni satır , noktalı virgül operatörüne eşdeğer değildir . Bir listesi ;ayrılmış basit komutlar hala olduğu liste - hala izleyin basit komutlar okumaya devam etmelidir kabuk ayrıştırıcı gibi ;listelerinin veya listeyi - bir satır bütün bir komut listesini sınırlamak edebilir, oysa çalıştırmadan önce ayrılmış basit komutu. Fark ince, ama karmaşıktır: kabuk verilen kabuk zaten içinde okuduğu basit komutları değerlendirmeye başlayabilirsiniz nerede ise bir satır aşağıdaki verilerde okumak için daha önce şart, yeni satır, bir noktaya işaret vardır ;virgül yapar değil.

  • & : Bu, arka planda bir komut çalıştırarak aynı kabukta çalışmaya devam etmenizi sağlar.

     command1 & command2

    Burada, command1arka planda başlatılır ve command2hemen command1çıkmayı beklemeden hemen ön planda çalışmaya başlar .

    Sonrasındaki yeni satır command1isteğe bağlıdır.

A.2 Mantıksal operatörler

  • && : AND listeleri oluşturmak için kullanılır, yalnızca bir başkası başarılı bir şekilde çıkarsa bir komutu çalıştırmanıza izin verir.

     command1 && command2

    Burada, command2sonra çalıştırmak olacaktır command1bittikten ve sadece eğer command1(kendi çıkış kodu 0 ise) başarılı oldu. Her iki komut ön planda çalıştırılır.

    Bu komut da yazılabilir

    if command1
    then command2
    else false
    fi

    veya sadece if command1; then command2; fiiade durumu göz ardı edilirse.

  • || : OR listelerini oluşturmak için kullanılır, bir komut başarısız olursanız sadece bir komut çalıştırmanıza izin verir.

     command1 || command2

    Burada, command2sadece command1başarısız olursa (eğer 0 dışında bir çıkış durumu döndürdüyse) çalışacaktır . Her iki komut ön planda çalıştırılır.

    Bu komut da yazılabilir

    if command1
    then true
    else command2
    fi

    veya daha kısa bir şekilde if ! command1; then command2; fi.

    Not &&ve ||sola ilişkilendirilebilir; bkz . Kabuk mantıksal işleçlerin önceliği &&, || daha fazla bilgi için.

  • !: Bu, "değil" operatörü olarak hareket eden (ancak bir sınırlayıcıya sahip olmalı), bir komutun dönüş durumunu reddetmek için kullanılan ayrılmış bir kelimedir - komut sıfır olmayan bir durum döndürürse 0, 0 durumu döndürürse 1 döndür Ayrıca testyardımcı program için mantıklı DEĞİLDİR .

    ! command1
    
    [ ! a = a ]

    Ve Aritmetik İfadeler içindeki gerçek bir NOT operatörü:

    $ echo $((!0)) $((!23))
    1 0

A.3 Boru operatörü

  • |: Boru operatörü, bir komutun çıktısını diğerine girdi olarak iletir. Boru operatöründen oluşturulan bir komuta boru hattı olarak adlandırılır .

     command1 | command2

    Tarafından yazdırılan herhangi bir çıktı command1, girdi olarak iletilir command2.

  • |&: Bu 2>&1 |bash ve zsh için bir steno . Bir komutun hem standart çıktısını hem de standart hatasını diğerine girdi olarak iletir.

    command1 |& command2

A.4 Diğer liste noktalama işaretleri

;;yalnızca bir durum ifadesinin sonunu işaretlemek için kullanılır . Ksh, bash ve zsh ayrıca ;&sonraki davaya geçmeyi ve ;;&(ATT ksh'de değil) devam etmeyi ve sonraki davaları test etmeyi destekler.

(ve )kullanılır grup komutları ve bir kabuktaki çalıştırmanız yeterli. {ve }ayrıca grup komutları, fakat bunları bir alt kabukta başlatmayın. Kabuk sözdizimindeki çeşitli parantez, parantez ve ayraç türlerinin tartışılması için bu cevaba bakınız .

B. Yönlendirme Operatörleri

Yönlendirme Operatörü

Kabuk komut dilinde, yeniden yönlendirme işlevini gerçekleştiren bir belirteç. Aşağıdaki sembollerden biridir:

<     >     >|     <<     >>     <&     >&     <<-     <>

Bunlar, komutlarınızın giriş ve çıkışını kontrol etmenizi sağlar. Basit bir komut içinde herhangi bir yerde görünebilirler veya bir komutu izleyebilirler. Yönlendirmeler, göründükleri sırada soldan sağa doğru işlenir.

  • < : Komuta girdi verir.

    command < file.txt

    Yukarıdaki commandiçerik üzerinde yürütülecektir file.txt.

  • <>: Yukarıdaki ile aynı, ancak dosya açık olan okuma + yazma yerine modunda salt okunur :

    command <> file.txt

    Dosya yoksa, oluşturulur.

    Bu operatör nadiren kullanılır, çünkü komutlar genellikle sadece kendi komutlarından okunurlar , ancak belirli durumlarda kullanışlı olabilirler .

  • > : Bir komutun çıktısını bir dosyaya yönlendirir.

    command > out.txt

    Yukarıdaki, commandas çıktısını kaydeder out.txt. Dosya varsa, içeriğinin üzerine yazılacak ve mevcut değilse oluşturulacaktır.

    Bu operatör aynı zamanda bir şeyin standart hataya mı yoksa standart çıktıya mı yazdırılacağını seçmek için kullanılır :

    command >out.txt 2>error.txt

    Yukarıdaki örnekte, >standart çıkışı 2>yönlendirir ve standart hatayı yönlendirir. Çıktı da kullanılarak yeniden yönlendirilebilir, 1>ancak bu varsayılan olduğundan 1, genellikle ihmal edilir ve basitçe yazılır >.

    Yani, çalıştırmak için commandüzerine file.txtve onun içinde çıktısını kaydetmek out.txtve herhangi bir hata iletileri error.txtçalıştırmak olacaktır:

    command < file.txt > out.txt 2> error.txt
  • >|: >Kabuk üzerine yazmayı reddedecek şekilde yapılandırılmış olsa bile , aynısını yapar ancak hedefin üzerine yazacaktır ( set -Cveya ile set -o noclobber).

    command >| out.txt

    Varsa out.txt, çıktısı commandiçeriği değişecektir. Eğer yoksa, yaratılacaktır.

  • >>: >Hedef dosya varsa, yeni verinin eklenmesiyle aynı şeyi yapar .

    command >> out.txt

    Varsa out.txt, içinde commandne varsa, sonra çıktısı eklenecektir. Eğer yoksa, yaratılacaktır.

  • &>, >&, >>&Ve &>>: (standart dışı). Sırasıyla değiştirme veya ekleme, hem standart hata hem de standart çıktıyı yönlendirin.

    command &> out.txt

    Hem standart hata hem de standart çıktı commandkaydedilecek out.txt, içeriğinin üzerine yazılacak veya mevcut değilse oluşturulacak.

    command &>> out.txt

    Yukarıdaki gibi, haricinde out.txt, çıktı ve hatanın commandbuna ekleneceği dışında.

    &>Varyant kaynaklıdır bashederken, >&varyant csh (on yıllardır erken) geliyor. Her ikisi de diğer POSIX kabuk operatörleriyle çakışıyor ve taşınabilir shkomut dosyalarında kullanılmamalıdır .

  • <<: Bir burada belge. Genellikle çok satırlı dizeleri yazdırmak için kullanılır.

     command << WORD
         Text
     WORD

    Burada, commandbu bir sonraki yerini bulana kadar her şeyi alacak WORD, Textgirdi olarak, yukarıdaki örnekte. WORDSık sık EoFveya bunların varyasyonları olsa da, istediğiniz herhangi bir alfasayısal (ve sadece değil) dize olabilir. WORDAlıntı yapıldığında , bu belgedeki metin anlamıyla ele alınır ve genişleme yapılmaz (örneğin değişkenlerde). Belirtilmemişse, değişkenler genişletilecektir. Daha fazla ayrıntı için bash kılavuzuna bakın .

    Çıktısını command << WORD ... WORDdoğrudan başka bir komuta veya komutlara yönlendirmek istiyorsanız, boruyu, aynı << WORDsondaysa, WORD sonlandırmasından sonra veya sonraki satırda koyamazsınız. Örneğin:

     command << WORD | command2 | command3...
         Text
     WORD
  • <<<: Burada, belgelere benzer ancak tek bir satır için tasarlanan dizeler. Bunlar sadece Unix limanında veya rc'da (kaynaklandığı yer), zsh, ksh, yash ve bash'ın bazı uygulamalarında mevcuttur.

    command <<< WORD

    Verilen her WORDşey genişletilmiş ve değeri girdi olarak iletilmiştir command. Bu genellikle değişkenlerin içeriğini bir komuta girdi olarak iletmek için kullanılır. Örneğin:

     $ foo="bar"
     $ sed 's/a/A/' <<< "$foo"
     bAr
     # as a short-cut for the standard:
     $ printf '%s\n' "$foo" | sed 's/a/A/'
     bAr
     # or
     sed 's/a/A/' << EOF
     $foo
     EOF

Dosya tanımlayıcılarını kapatmak veya çoğaltmak için birkaç başka operatör ( >&-, x>&y x<&y) kullanılabilir. Onlara ilgili ayrıntılar için (kullandığınız kabuğun kılavuzun ilgili bölüme bakınız lütfen buraya partisi yüzünden örneğin).

Bu sadece Bourne benzeri mermilerin en yaygın operatörlerini kapsar. Bazı mermilerin kendilerine ait birkaç ek yönlendirme operatörü vardır.

Ksh, deneme ve zsh da yapıları vardır <(…), >(…)ve =(…)(o ikinci bir zshtek). Bunlar yönlendirmeler değil, işlem değişikliğidir .


2
Tüm kabukların eşit olmadığını ve özellikle bash'a özgü özelliklerin altını çizdiğine dikkat etmek muhtemelen faydalı olacaktır.
Greg Hewgill

1
@GregHewgill evet, saygıyla tartıştığımı söyleyerek bunu zayıflattım bash. Bu, çeşitli "Bu garip şey ne yapar" sorularını kapatmak için kanonik bir soru cevap olarak tımar ediliyor ve bunların çoğu bash kullanıcılarından geliyor. Başka birinin araya girip bash olmayan mermileri cevaplayacağını umuyorum, ancak bash'a özgü olanları vurgulamak çok mantıklı geliyor. Yine de kontrol etmeliyim, hangisinin başımın üstünde olduğunu bilmiyorum.
terdon

&>, >>>ve, ve burada-doc adındaki yalnızca alfanum olmayan karakterlerin <<<referansı olduğu gibi posix değildir . Bu cevap da hakkında çok az anlatılır nasıl çalıştıkları - örneğin, bir konuda konuşmak faydasız daha neredeyse kötüdür basit komuta ve komuta Bunların ne açıklayan ve nasıl kabuk karar vermeden.
mikeserv

@mikeserv teşekkürler. Yine de bash ve zsh üzerinde çalışıyorlar. Bir şey varsa, gerçekten bu listeye özgü olan ne bilmiyorum. Bundan geçmeli ve her bir çalışmayı kapsayan kabukları eklemeliyim, ama bu önce öğrenmeyi gerektirir.
terdon

1
@ Arc676 Hayır, doğru veya yanlış olarak değerlendirilmezler, bu tamamen farklı bir bağlamdır. Bu sadece 0 olmayan bir çıkış değerinin bir sorunu belirtir (değil false) ve 0 çıkış kodunun başarısını gösterir (değil true) anlamına gelir. Bu her zaman yol oldu ve oldukça standart. 0 olmayan bir çıkış kodu, bildiğim her ortamda bir hata olduğunu gösteriyor.
terdon

60

'>' İle ilgili uyarı

G / Ç yönlendirmesini ( <ve >) henüz öğrenmiş olan Unix yeni başlayanlar genellikle

Komut ... input_file > the_same_file

veya

command … < dosya      > the_same_file

veya, neredeyse eşdeğerde

kedi dosyası | komut …> the_same_file

( grep, sed, cut, sort, Ve spellinsanlar bu gibi yapılara kullanmak için cazip olan komutlar örnekleridir.) Kullanıcılar bu senaryolar boş hale dosyayı neden olduğunu keşfetmek için şaşırırlar.

Diğer cevapta belirtilmemiş gibi görünen bir nüans , bash'ın (1) Yönlendirme bölümünün ilk cümlesinde gizlenmiş olarak bulunabilir :

Bir komut çalıştırılmadan önce, giriş ve çıkış , kabuk tarafından yorumlanan özel bir gösterim kullanılarak yönlendirilebilir .

İlk beş kelimenin, kalın, italik, altı çizili, büyütülmüş, yanıp sönen, kırmızı renkte kırmızı üçgen içinde ünlem işaretiolması ve kabuğun komutun yerine getirilmesinden önce istenen yönlendirmeleri gerçekleştirdiğini vurgulamak için bir simge ile işaretlenmiş olması gerekir . Ve ayrıca hatırla

Çıktının yeniden yönlendirilmesi, dosyanın… yazmak için açılmasına neden olur…. Dosya yoksa, oluşturulur; eğer varsa, sıfır boyuta kesilir.

  1. Yani, bu örnekte:

    sort roster > roster

    Kabuk roster, sortprogram çalışmaya başlamadan önce dosyayı yazmak için kısaltır (yani tüm içeriğini atar) . Doğal olarak, verileri kurtarmak için hiçbir şey yapılamaz.

  2. Biri bunu beklemeyebilir

    tr "[:upper:]" "[:lower:]" < poem > poem

    daha iyi olabilirdi. Kabuk, yönlendirmeleri soldan sağa işlediğinden, yazmak için açmadan önce (standart çıktı için) poemokumak için açılır ( trstandart giriş için). Ama yardımcı olmuyor. Bu işlem sırası iki dosya tanıtıcısı verse de, ikisi de aynı dosyaya işaret eder. Kabuk dosyayı okumak için açtığında, içerik hala oradadır, ancak program yürütülmeden önce yine de engellenir. 

Peki bu konuda ne yapmalı?

Çözümler şunları içerir:

  • Çalıştırdığınız programın, çıktının nereye gideceğini belirtmek için kendi içsel, yetenekli olup olmadığını kontrol edin. Bu genellikle -o(veya --output=) bir belirteçle gösterilir. Özellikle,

    sort roster -o roster

    kabaca eşittir

    sort roster > roster

    Ancak, ilk durumda, sortprogram çıktı dosyasını açar. Kadar Ve çıkış dosyasını açmak için yeterli zeki sonra o giriş dosya (lar) tüm okuma.

    Benzer şekilde, en azından bazı versiyonları sedbir var -i(edit i geri girdi dosyasına dışarı çıktı yazmak için kullanılabilir n yerleştirmek) seçeneğini (yine sonra tüm giriş okundu). Gibi Editörler ed/ ex, emacs, pico, ve vi/ vim kullanıcı bir metin dosyasını düzenlemek ve orijinal dosyada düzenlenmiş metni kaydetmek için izin verir. Not ed(en azından) etkileşimsiz kullanılabilir.

    • viilgili bir özelliği var. Eğer yazarsanız , bu dışarı düzenleme tamponu içeriğini yazacak çıkışını okumak, ve (orijinal içeriğini değiştirme) tampon içine sokun.:%!commandEntercommand
  • Basit ama etkili:

    commandinput_file > temp_file   && mv temp_file  input_file

    Bu input_file, bir bağlantı olması durumunda (muhtemelen) ayrı bir dosya ile değiştirileceği dezavantajına sahiptir . Ayrıca, yeni dosya varsayılan koruma ile size aittir. Özellikle, bu, orijinal olmasa bile, dosyanın dünya tarafından okunabilir hale gelme riskini taşır input_file.

    Varyasyonlar:

    • commandinput_file > temp_file && cp temp_file input_file && rm temp_file
      ki hala (potansiyel olarak) temp_filedünyayı okunabilir kılar. Daha iyi:
    • cp input_file temp_file && commandtemp_file > input_file && rm temp_file
      Bunlar, potansiyel olarak iki kat daha fazla G / Ç maliyeti karşılığında dosyanın bağlantı durumunu, sahibini ve modunu (korumasını) korur. (Sen gibi bir seçeneği kullanmak gerekebilir -aveya -pilgili cp özelliklerini korumak için bunu söylemek için.)
    • commandinput_file > temp_file &&
      cp --attributes-only --preserve=all input_file temp_file &&
      mv temp_file input_file
      (sadece okunabilirlik için ayrı satırlara bölünür) Bu, dosyanın modunu korur (ve eğer siz kökseniz, sahibini), ancak size ait kılar (siz kök değilseniz) ve ayrı bir dosya.
  • Bu blog (“yerinde” dosyaların düzenlenmesi) önerir ve açıklar

    {rm input_file   &&   command …> input_file ; } < input_file

    Bu, commandstandart girdiyi işleyebilmesini gerektirir (ancak neredeyse tüm filtrelerin yapabilmesi gerekir). Blogun kendisi buna riskli bir tortu diyor ve kullanımını engelliyor. Ve bu aynı zamanda size ait ve varsayılan izinlere sahip yeni, ayrı bir dosya (hiçbir şeye bağlı değil) oluşturacaktır.

  • Moreutils paketi adı verilen bir komut içeriyor sponge:

    komutinput_file | the_same_file'ın sünger

    Daha fazla bilgi için bu cevaba bakınız .

İşte bana tam bir sürpriz olarak gelen bir şey: sözdizimi diyor ki :

[Bu çözümlerin çoğu] “salt okunur” sizin demektir salt okunur bir dosya sistemi üzerinde başarısız olur $HOME olur yazılabilir olabilir, ama /tmpolacak salt okunur (varsayılan olarak). Örneğin, Ubuntu'nuz varsa ve Kurtarma Konsolu'nu başlattıysanız, genellikle durum budur. Ayrıca, burada-belge operatörü <<<gerek duyduğu, ya orada çalışmaz /tmpedilecek okuma / yazma o da orada içine geçici bir dosya yazacağız çünkü.
( bu soru bir strace'd çıktı içeriyorsa bkz. )

Bu durumda aşağıdakiler işe yarayabilir:

  • Yalnızca gelişmiş kullanıcılar için: komut girişi olmadığı için çıkış aynı miktarda veri üretmesi garanti edilirse (örneğin sort, ya tr olmadan-d veya -sopsiyon), deneyebilirsin
    komutinput_file | = the_same_file cond = notrunc
    Bkz bu cevabı ve bu cevabı komut girişi olmadığı için çıkış aynı miktarda veri üretme garantisi ise çalışmak yukarıdaki açıklaması içeren daha fazla bilgi için, ve alternatifler ya da daha az (örneğin grep, ya da cut). Bu cevaplar, boş alan gerektirmemesi (veya çok az gerektirmesi) avantajına sahiptir. Formun üstündeki cevaplar , sistemin tüm girdi (eski) dosyasını ve çıktı (yeni) dosyasını aynı anda tutabilmesi için yeterli boş alan olmasını gerektirir; bu açıkça açıkça diğer çözümlerin çoğu için de geçerlidir (örn. ve ). İstisna: Muhtemelen çok fazla boş alan gerektirecektir çünkücommandinput_file > temp_file && …sed -ispongesort … | dd …sort Herhangi bir çıktıyı yazabilmesi için önce tüm girdilerini okuması gerekir ve bu verilerin tümünü geçici bir dosyada değilse, en çok arabellek yazması gerekir.
  • Sadece ileri düzey kullanıcılar için:
    commandinput_file 1 <> the_same_file
    ddYukarıdaki cevaba eşdeğer olabilir . Sözdizimi dosya tanımlayıcı üzerinde adlı dosyayı açar girdi hem de çıktı için bir kombinasyonu tür - it kesmeden, ve . Not: Bazı programlar (örn. Ve ) bu senaryoda çalışmayı reddedebilir, çünkü giriş ve çıkışın aynı dosya olduğunu tespit edebilirler. Yukarıdakilerin tartışması için bu cevaba bakınız ve eğer emrinizin giriş veya daha az olduğu kadar aynı miktarda çıktı verisi üretme garantisi verilmişse, bu cevabı çalıştıran bir script . Uyarı: Peter'ın senaryosunu test etmedim, bu yüzden buna kefil değilim.n<> filen n<n>catgrep

Peki, soru neydi?

Bu U&L'de popüler bir konudur; aşağıdaki sorularda ele alınmaktadır:

… Ve bu Süper Kullanıcı veya Ask Ubuntu'ya sayılmaz. Yukarıdaki soruların cevaplarından bu bilgilerin çoğuna bu cevabı dahil ettim, hepsini değil. (Yani, daha fazla bilgi için, yukarıda listelenen soruları ve cevaplarını okuyun.)

PS Yukarıda bahsettiğim blog ile bir bağlantım yok .


Bu soru ortaya çıkmaya devam ettiğinden, elimi “kanonik bir cevap” yazarken denerim diye düşündüm. Bunu buraya göndermeli miyim (ve belki de daha ağır trafikle uğraşan diğer soruların bir kısmından bağlantı kurmalı mıyım), yoksa bu konuyu gerçekten ortaya çıkaran sorulardan birine mi aktarmalıyım? Ayrıca, bu belki de soruların birleştirilmesi gereken bir durum mu?
Scott,

/ tmp Geçici dosyalar oluşturmak için bir yere ihtiyaç duyan uygulamalar için kullanılabilir bir dizin. Başvuruların bu dizinde dosya yaratmasına izin verilmelidir, ancak başvuruların çağrıları arasında bu dosyaların saklandığını varsaymayacaktır.
mikeserv

@mikeserv: Evet, (1) Sözdiziminden alıntı yapıyorum ve (2) Şaşırdığımı söyledim. Bir şey okuma-yazma olursa, olacağını düşünmüştüm /tmp.
Scott,

Bence olarak, çünkü Mesele @syntaxerror sözü iki kat garip dashUbuntu varsayılan kurtarma kabuk olurdu ve bu sadece bir anlamıyor <<<herestring, ama aynı zamanda anonim boruları alır <<bulaşmak heredocuments ve değil ${TMPDIR:-/tmp}bunun için hiç bir amaç. Burada belge kullanımına ilişkin demolar için buna veya buna bakın . Ayrıca neden aynı miktarda çıktı veya daha az uyarı?
mikeserv

@mikeserv: Evet, dd … conv=notruncve 1<>komutun çıktısı girişi (örneğin küçükse cevaplar, çıktı dosyasını kesmek, böylece asla grep), dosyanın sonuna arta kalan orijinal bazı bayt olacaktır. Çıkış girişi büyükse Ve (örneğin cat -n, nlya da (potansiyel olarak) grep -n), bunu okudum önce eski verilerin üzerine yazma riski var.
Scott,

29

Daha gözlemler üzerine ;, &, (ve)

  • Terdon'un cevabındaki komutların bazıları boş olabilir. Mesela söyleyebilirsin

    command1 ;

    (hayır ile command2). Bu eşdeğerdir

    command1

    (yani, sadece command1ön planda çalışır ve tamamlanmasını bekler.)

    command1 &

    (hayır ile command2) command1arka planda başlayacak ve ardından derhal başka bir kabuk istemi yayınlayacaktır.

  • Buna karşılık, command1 &&, command1 ||ve command1 |herhangi bir anlam ifade yoktur. Bunlardan birini yazarsanız, kabuk (muhtemelen) komutun başka bir satıra devam ettiğini varsayar. Normalde ayarlanan ikincil (devam) kabuk istemini görüntüler >ve okumaya devam eder. Bir kabuk betiğinde, bir sonraki satırı okuyacak ve zaten okuduğu şeye ekleyecektir. (Dikkat: bu olmak istediğin şey olmayabilir.)

    Not: Bazı mermilerin bazı sürümleri bu gibi eksik komutları hata olarak kabul edebilir. Bu gibi durumlarda (veya aslında, uzun bir komutun olduğu herhangi bir durumda), \kabuğa başka bir satırda komutu okumaya devam etmesini söylemek için satırın sonuna ters eğik çizgi ( ) ekleyebilirsiniz :

    command1  &&  \
    command2

    veya

    find starting-directory -mindepth 3 -maxdepth 5 -iname "*.some_extension" -type f \
                            -newer some_existing_file -user fred -readable -print
  • Terdon diyor, şöyle (ve )grup komutlara kullanılabilir. Bu tartışma ile “gerçekten alakalı olmadıkları” ifadesi tartışmalıdır. Terdon'un cevabındaki komutlardan bazıları komut grupları olabilir . Örneğin,

    ( command1 ; command2 )  &&  ( command3; command4 )

    bunu yapar:

    • Koş command1ve bitmesini bekle.
    • Ardından, ilk komutu çalıştırmanın sonucuna bakmaksızın, çalıştırın command2ve bitmesini bekleyin.
    • Sonra, eğer command2başarılı olursa ,

      • Koş command3ve bitmesini bekle.
      • Ardından, bu komutu çalıştırmanın sonucuna bakmaksızın, çalıştırın command4ve bitmesini bekleyin.

      command2Başarısız olursa , komut satırını işlemeyi durdurun.

  • Dış parantez içinde |çok sıkı bağlanır,

    command1 | command2 || command3

    eşittir

    ( command1 | command2 )  ||  command3

    ve &&ve ||daha sıkı bağlanan ;, yani

    command1 && command2 ; command3

    eşittir

    ( command1 && command2 ) ;  command3

    yani, ve / veya command3çıkış durumundan bağımsız olarak yürütülecektir .command1command2


Mükemmel, +1! İlgilenmediklerini söyledim çünkü o kadar ayrıntıya girmek istemedim. Çeşitli komutların sonunda tüm garip dalgalanmaların ne olduğunu merak eden yeni başlayanlar için hızlı bir sayfa olarak çalışabilecek bir cevap istedim. Faydalı olmadıklarını ima etmek istemedim. Bunları eklediğiniz için teşekkürler.
terdon

1
"Kritik kütle" sorunu hakkında endişeliyim - mermiler hakkında söyleyebileceğimiz her şeyi yayınlarsak, kendi başımıza yazacağız , Bash Reference Manual'ın DR versiyonu.
G-Man

Ayrıca bahsetmeye değer: C ailesinin dillerinden farklı olarak, ;kendi başına (veya ondan önceki bir komut olmadan), bir sözdizimi hatasıdır ve boş bir ifade değildir. Böylece ; ;bir hatadır. (Yeni kullanıcılar için ortak bir sorun, IMHO). Ayrıca: ifadeler ;;için özel bir sınırlayıcıdır case.
muru

1
@muru: İyi nokta, ama genelleştirelim. Herhangi komutları arasında görünebilir kontrol operatörlerin: ;, &&, ||, &, ve |onları önceki hiçbir şey görünüyorsa, hatalardır. Ayrıca, terdon cevabında ;;(kısaca) hitap etti.
G-Man

1
@Wildcard: Tamam, nereden geldiğini anlıyorum. Anahtar kelime "may" dır; Tüm söylediğim, bütün mermilerin bu tür yapıları kabul edeceğini garanti etmememdi (yani, YMMV). Açıkçası linebreak, POSIX kabuk dilbilgisinde belirtecin kullanımını bilmeden önce yazdım . Bu yüzden belki tüm POSIX uyumlu mermilerin onları kabul edeceğini söylemek güvenlidir. Genel bir feragatname olarak ifademe katılıyorum; Gerçek bir Bourne kabuğu veya daha eski gibi yeterince eski bir POSIX kabuğu bulursanız, tüm bahisler kapalıdır.
G-Man
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.