Bir komutun sonunda ve sonunda anlamı nedir?


12

Bir başlangıç ​​komut dosyası satırım var:

pyprogramm >> /dev/null  2>&1 &

anlamları:

>> /dev/null - redirect stdout to null device
2>&1 - redirect stderr to stdout (that is redirected to null device)

ama en son ne anlama &geliyor?

Yanıtlar:


16

& Sonlandırıcı nedir?

Sondaki &bir komutun sonunda operatör arka plana komutları koymak için kullanılır. Bu aslında POSIX standardında belirtilen standart bir sözdizimidir :

Eşzamansız Listeler

Bir komut kontrol operatörü ('&') tarafından sonlandırılırsa, kabuk komutu alt kabukta eşzamansız olarak yürütür. Bu, kabuğun bir sonraki komutu yürütmeden önce komutun bitmesini beklememesi gerektiği anlamına gelir.

Arka planda bir komut çalıştırma biçimi:

komut1 & [komut2 & ...]

Komutların arka planının amacı, komutta ana kabuk veya komut beklerken etkileşimli kabuk olmadan bir komut çalıştırmaktır; bu, diğer komutların yürütülmesini engelleyecek ve kullanıcının beklemesini zorlaştıracaktır. Bu, uzun süren komutları başlatmak için kullanışlıdır, ancak geçerli kabukta çalışmaya devam etmeniz gerekir. Tahmin edebileceğiniz gibi, bu çok sekmeli terminal emülatörlerinin olmadığı zamandan kaynaklandı, ancak terminaller bir bilgisayara bağlı gerçek fiziksel donanımdı.

Tanımdan &, komut listelerinde olduğu gibi komut sonlandırıcı olarak da hizmet ettiğini görebilirsiniz ;. Özel örneğinizde, pyprogramm >> /dev/null 2>&1 &listede yalnızca bir komut vardır.

Ardışık ; listeler ile eşzamansız karşılaştırmalar & listeler

Daha genel olarak,

echo Hello ; echo World ;

ve

echo Hello & echo World &

;ve &operatörleri tarafından sonlandırılan iki liste örneğidir . Farklardan biri, iş kontrolü devre dışı bırakılırsa &sonlandırılmış listenin girdiye bağlı /dev/nullolmasıdır:

İş kontrolü devre dışı bırakılırsa (bkz. Set, -m), herhangi bir açık yeniden yönlendirme gerçekleştirilmeden önce eşzamansız bir listenin standart girdisinin / dev / null ile aynı özelliklere sahip bir dosyaya atanmış olduğu kabul edilir. İş kontrolü etkinleştirilmişse bu gerçekleşmeyecektir. Her durumda, standart girdinin açıkça yeniden yönlendirilmesi bu etkinliği geçersiz kılar.

Ancak sıralı listede, stdinaçık bir yönlendirme yoksa her komut yine de terminale bağlanmıştır.

Ayrıca, daha önce bahsettiğimiz tanımdan &, alt kabuktaki komutları yürüttüğünü de unutmayın . Buna karşılık, ;sonlandırılmış liste geçerli kabukta yürütülür. Çıkış durumlarında da fark var. İçin &standart diyor ki:

Eşzamansız bir listenin çıkış durumu sıfır olmalıdır.

Arka plana birden fazla komut koymak istediğinizde bu önemlidir. Bir komut dosyası veya komut yazdığınızda, başarısız olup olmadıklarını umursamayacağınız komutları seçmeniz veya sıfır olmayan (hata) çıkış durumunu işlemek için bir yol bulmanız gerekir. Özel örneğinizde, pyprogramm >> /dev/null 2>&1 &arka planda çalışmanın başarısız olup olmadığını belirtmenin bir yolu olmalıdır, ancak kullandığınızı yargılayarak 2>&1hata çıktısını yeniden yönlendirerek gizlediğinizi ve muhtemelen komut dosyasının başarısız olmaması gerektiğini varsayabilirsiniz.

Buna karşılık, ;çıkış durumu şu şekilde tanımlanır:

Bir sıralı listenin çıkış durumu, listedeki son komutun çıkış durumu olacaktır.

Yine, bunun komut satırına sıralı bir komut listesi nasıl yazacağınız ve listedeki komutlardan bazıları başarısız olursa işlerin nasıl ele alınmasını istediğiniz üzerinde etkileri vardır.


Yan notlar ve ek okuma

  • Bu tüm Bourne benzeri kabukları, anlamı o POSIX tanım araçları olması bash, dashve kshbunu desteklemesi gerekir.

  • &yönlendirme &komut sonlandırıcı olarak farklıdır . Dosya tanımlayıcı nesnesinin çoğaltılması (kopyalanması) anlamına gelir. Bkz & çıkış yönlendirme tam olarak ne anlama geliyor?

  • Burada operatör bashde vardır |&(boru ve ve işareti arasında boşluk olmamalıdır). Gönderen bash kılavuzda :

    | & Kullanılırsa, komutun standart çıkışına ek olarak, standart çıkışına ek olarak komutun standart hatası, boru üzerinden komut2'nin standart girişine bağlanır; 2> & 1 | için kısaltmadır. Standart hatanın standart çıktıya bu örtülü olarak yönlendirilmesi, komut tarafından belirtilen herhangi bir yeniden yönlendirmeden sonra gerçekleştirilir.


2
&Çıktıyı gizleme hakkında söyledikleriniz doğru gelmiyor. Alıntıladığınız standarttan paragraf çıktıdan değil girişten bahseder . İş kontrolünün etkinleştirilip etkinleştirilmemesi arasındaki farkın nedeni, tty'den okumaya çalışan bir arka plan işleminin askıya alınmasıdır. Bu noktada, beklediği girişi sağlamak için iş kontrolünü ön plana koymak için kullanmanız gerekir. Bunların hepsi iş kontrolü olmadan yapılamaz ve bu nedenle iş kontrolü devre dışı bırakılmışsa, stdin'in yeniden eşdeğerden veya eşdeğerden yönlendirilmesi gerekir . /dev/null
kasperd

Düzenlemenizde de bir hata tespit ettim. Yazdığınız bir yerde etkin yazmayı devre dışı bırakmış olmanız gerekir.
kasperd

@kasperd Evet, bunu fark ettiğimde POSIX sayfasını tekrar okuyordum. Zaten çözüldü. Başka bir şeyin düzenlemeye ihtiyacı olup olmadığını bana bildirin. Teşekkürler :)
Sergiy Kolodyazhnyy

3

Komutu arka planda çalıştırmak anlamına gelir. Çağıran komut dosyası, çağrılan komut tamamlanana kadar engelleme yerine devam eder.


0

&bu, komut dosyasının denetimini işletim sistemine döndürür, ancak nohuptüm yürütmeyi doğrudan gönderdiği için yanıtı arka plana gönderir

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.