“Exec &> dosya adı” verdikten sonra terminale çıkışı geri yükleme


15

Aşağıdaki yürütmek çalışıyorum:

exec &>filename

Bundan sonra yazdıklarım dahil hiçbir şey göremiyorum, tamam.

Çılgınca deniyorum exec 1>&1ve exec 2>&2hiçbir şey olmuyor.

Şimdi, kabuğu öldürmeden, stdout'a ve hata stderr'e yönlendirilen çıktıyı nasıl geri alabilirim? Dosya tanımlayıcıları standart [in | out] put ve stderr'e başvurmanın tek yolu mudur?


1
Hmm ... neden interaktif kabuğunuzun stderr / stdout'unu yeniden yönlendiriyorsunuz? Bu execyapı genellikle çıktılarını örneğin bir dosyaya yönlendirmek için alt kabukta çalışan komut dosyalarında kullanılır. Etkileşimli bir oturumda bunun için bir kullanım görmüyorum.
Martin von Wittich

3
@MartinvonWittich Ben exec hakkında açıklama katılıyorum. Katılıyorum. Ben sadece etrafta oynayan bir
çocukum

Yanıtlar:


23

Çalıştırdıktan sonra exec &>filename, kabuğun standart çıktısı ve standart hatası gider filename. Standart girdi tanım gereği 0 dosya tanımlayıcısıdır ve standart çıktı fd 1'dir ve standart hata fd 2'dir.

Bir dosya tanımlayıcı yeniden yönlendirilmez veya yönlendirilmez: her zaman bir yere gider (işlemin bu tanımlayıcı açık olduğu varsayılarak). Bir dosya tanımlayıcıyı yeniden yönlendirmek, gittiği yeri değiştirmek anlamına gelir. Eğer bittiği zaman exec &>filename, stdout ve stderr eskiden terminaline bağlanmıştır ve bağlı oldu filename.

Mevcut terminalden başvurmak için bir yol her zaman vardır: /dev/tty. Bir işlem bu dosyayı açtığında, her zaman sürecin kontrol terminali (hangisi olursa olsun) anlamına gelir . Bu kabuğun orijinal stdout ve stderr'ını geri almak istiyorsanız, bunu yapabilirsiniz çünkü bağlı oldukları dosya hala etrafında.

exec &>/dev/tty

1
@Joseph R. yanıtladı $ (tty) bana / dev / pty0 gösterir, ama komutunuz da çalışır, hangisi Unix lezzetleri arasında daha taşınabilir? daha net cevap için teşekkür ederim.
user917279

2
@ user917279 Farklı unix aromaları üzerinde çalışma anlamında eşit derecede taşınabilirler. /dev/ttyçalışmadığı durumlarda çalışır $(tty): /dev/ttyişlemin bir kontrol terminali olduğu sürece çalışır (bu, işlemi terminale bağlayan bir şey olması gerektiği için umabileceğiniz en iyisidir), ancak $(tty)terminalin hala açılmasını gerektirir standart giriş.
Gilles 'SO- kötü olmayı kes'

Neden exec &>/dev/ttyolmasın exec >/dev/tty?
Anthony Rutledge

@AnthonyRutledge Çünkü soru sonra exec &>filenamene yapılacağı, sonra ne yapılacağıdır exec >filename.
Gilles 'SO- kötü olmayı bırak'

11

İstediğiniz

exec &>$(tty)

Sorunuzda yaptığınız şey, stdout ve stderr dosyalarına önceden yönlendirilmiş olan orijinal stdout ve stderr'da çoğaltılmasıdır.

Gilles'in cevabı açıkladığı gibi, ttymevcut terminalin terminal cihazını döndürecektir. Burası, üç standart dosya tanımlayıcısının varsayılan olarak bir oturum açma kabuğunda geldiği / gideceği yerdir. Bu nedenle yukarıdaki ifade, ttystdout ve stderr'i daha önce olduğu gibi terminal cihazına yönlendirmek için kullanılır .

Taşınabilirlikle ilgili endişeleriniz varsa (Gilles'in cevabı hakkındaki yorumunuza göre), her iki yöntem de ( tty yardımcı programı ve /dev/ttydosya ) POSIX standardındadır.

Gilles'in yorumundan kelimesi kelimesine kopyalandı:

There's an advantage to /dev/tty: it works even after exec <somefile, 
whereas $(tty) would complain “not a tty”

işe yarıyor! Teşekkür ederim. echo $ (tty) / dev / pty0 (cygwin'de) verir, stdin, stdout ile nasıl ilişkilidir ve yukarıdaki ifadeyle ne olur? lütfen bunu ayrı bir soru olarak sormam gerekiyorsa bana bildirin.
user917279

@ user917279 Yanıt güncellendi.
Joseph R.

Teşekkürler Joseph. Bu soruyu Giles'in cevabına bakmadan önce gönderdim. Çok teşekkür ederim. Lütfen Giles cevabını kabul edilmiş olarak işaretlememe izin verin, çünkü benim gibi aptal zihinlerin bile doğru bir şekilde anlaşılmasını sağladı.
user917279

2
Avantajı vardır /dev/tty: daha sonra bile çalışır exec <somefile, oysa $(tty)“tty değil” den şikayetçi olur.
Gilles 'SO- kötü olmayı kes'

@Gilles Karakteristik olarak aydınlatıcı yorum için teşekkürler :)
Joseph R.
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.