arka plan işlem boru girişi


14

ekranda "aaa" görüntülemek istiyorsanız:

(1)$: echo aaa | cat                 ... works OK
(2)$: echo aaa | ( cat )             ... works OK
(3)$: echo aaa | ( cat & )           ... NOT working
(4)$: ( echo aaa & ) | cat           ... works OK 
(5)$: echo aaa | ( cat <&0 & )       ... works ok in BASH (but not in SH)
(6)$: echo aaa | ( cat <&3 & ) 3<&0  ... works ok in BASH and SH

(3) ve (4) -> müstakil süreçten gelen sonuç hala kontrol edilebilen, kullanılabilen, yeniden yönlendirilebilen ... çıkışa sahip, ancak giriş değil!

Sorum şu: birisi hat (5) 'in neden ve nasıl çalıştığını anlıyor mu ???

... "<& 0", "0 <& 0" için kısadır, 0'dan 0'a yönlendirme neden çözümdür ve koparılmış işlem girdisi ile gerçekte neler olur? Subshell sorun değil, (...) yerine {...} parantez kullanmak aynı sonuçları sağlar.

... ve soru2: "müstakil sürece girdi vermek" için satır (6) 'dan daha iyi bir çözüm var mı?

Yanıtlar:


12

Evet, POSIX'in gerektirdiği gibi , arka planda başlatılan komutların &standart girdilerinin yönlendirilmesi gerekir /dev/null.

Ve gerçekten

{ cmd <&3 3<&- & } 3<&0

bunun üzerinde çalışmanın en belirgin yoludur.

Peki neden boru hattının bir kısmını arka planda çalıştırmak istediğiniz açık değil.


nedeni boru zinciri içindeki belirli bir komutun PID'sini almaktı (cmd1 | {cmd2 &; pid2 = $ !;} | cmd3 ..., bu yüzden / dev / null == & 0 BG süreçleri için standarttır, neden "0 <& 0"
bash'da

3
@OmerMerdan POSIX diyor Her durumda, standart girdinin açıkça yeniden yönlendirilmesi, yukarıda söyledikleriyle bir şekilde çelişen bu etkinliği geçersiz kılacaktır , bu yüzden yeniden yönlendirmeyi bashiptal etmek olarak yorumladığına (ve makul bir yorum gibi geliyor) inanıyorum /dev/null. Şimdi, pek çok mermi aynı şeyi yapmıyor. Ash ve pdksh bilmiyor.
Stéphane Chazelas

Neden 3<&-gerekli olan parça ve kullanımı güvenli mi (tam giriş ir okunmadan boruyu kapatmayacak mı?)
mvorisek

1
@Mvorisek, bu fd 3 sadece orijinal stdin'i geri yüklemek için geçici olarak kullanılır. İhtiyacımız olmadığı için kapatıyoruz cmd. Fd 0 ( <&3kısa) için dupledikten sonra kapatıyoruz 0<&3.
Stéphane Chazelas

1
@Mvorisek, nohupSize gereken tek şey bu yüzden de, Stdin için / dev / null yönlendirir: { nohup sh -c 'cmd <&3 3<&-' & } 3<&0. Veya(trap '' HUP; cmd <&3 3<&- > nohup.out 2>&1 &) 3<&0
Stéphane Chazelas
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.