2013-06-01 16 views
8

Özet: Arka planda bir işlem çalıştıran ve normal bir komut olarak çalışacak bir komut satırı bloğu gibi bir bash komut dosyası var. $(...). Betiğin kendisi, arka plana çatallanan bir işlem ortaya çıkarır.

#!/bin/sh 
echo something 
sleep 5 & 

bir kabukta bu senaryoyu hemen yayınlamak dönecektir (ve baskı "bir şey") $(...) içine çalışan, backgrounded "uyku" bekliyor, 5 saniye boyunca askıda kalacaktır: test durumu indirgenebilir bitirmek için.

Komut ikamesi kabuğunda başlatılan ve görünüşte bu süreç ağacındaki çocuklar da dahil olmak üzere arka planda artalan süreçleri başlatır. Hem bash hem de zsh'i etkiliyor gibi görünüyor, başkalarını denemediniz.


Orijinal soru: Ben her çalıştığında Stdout'a bir değer yazdırmak gerekiyordu ve ayrıca X panoya kopyalama bir bash komut dosyası var.

$ something 
something 
$ xclip -o -selection clipboard 
something 
$ echo $(something) 
^C 
:

#!/bin/sh 
echo something 
echo something | xclip -selection clipboard 

Bu komut dosyası (en diyoruz "bir şey" let) (aslında başka komutun çıktısı olan) bu kelimeyi almak için kullanılacak ve bu şekilde farklı şekillerde kullanılabilir kastedilmektedir

Normal stdout'a yazdırır, çıktıyı normal X uygulamalarında kullanılacak panoya kopyalar ve ayrıca bu sözcüğü herhangi bir komutun ortasına eklemek için bash komutuyla birlikte stdout'u da kullanabilmelidir. Bununla birlikte, bash komutunun ikame edilmesi, ön planda canlı kalması için xclip'u zorlar gibi görünmektedir. xclip, X panosunun bir istemcinin pano içeriğini sağlamasını gerektirdiğinden ve varsayılan davranışı, pano içeriğinin değiştirilmesinden sonra onu devre dışı bırakması gerektiğinden, normal olarak kendini gizler. o

Herkes bu davranış açıklayabilir $(...) kabuğun içine daemonizes o şey uygulamak gibi görünüyor bu yüzden ben bu soruya başında yazdığı minimum test dava bile xclip bu konuyu ettikten sonra

? Bundan kaçınmamın bir yolu var mı? Arka plandaki işlemin komut değiştirmeye müdahale etmesini istemiyorsanız, stdout'unun bağlantısını kesmeniz gerekir.

cevap

12

$ cat bg.sh 
#!/bin/sh 
echo before 
sleep 5 >/dev/null & 
echo after 
$ date; x=$(./bg.sh); date; echo "$x" 
Sat Jun 1 13:02:26 EDT 2013 
Sat Jun 1 13:02:26 EDT 2013 
before 
after 

Sen backgrounded sürecin stdout'u yakalama yeteneği kaybeder, ancak arka planda çalıştırıyorsanız muhtemelen umurumda değil: Bu hemen dönecektir. bg.sh süreci her zaman diske yazabilir.

+0

Woo! Mükemmel ve son derece basit bir çözüm. Teşekkürler! – dequis

+0

Bu arada,/dev/null yerine bir dosyaya yönlendirmek çıktıyı yakalamak için çalışıyor gibi görünüyor, ama en azından burada çıktı dosyası sadece arkaplan işleminden sonra güncelleniyor gibi görünüyor. (Bunun için buna ihtiyacım yok) – dequis

İlgili konular