Yanıtlar:
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.
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/null
olması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, stdin
açı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>&1
hata çı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.
Bu tüm Bourne benzeri kabukları, anlamı o POSIX tanım araçları olması bash
, dash
ve ksh
bunu 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 bash
de 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.
Komutu arka planda çalıştırmak anlamına gelir. Çağıran komut dosyası, çağrılan komut tamamlanana kadar engelleme yerine devam eder.
&
Çı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