Yanıtlar:
Evet mümkündür, çıktıyı bir dosyaya yönlendirin:
SomeCommand > SomeFile.txt
Veya veri eklemek istiyorsanız:
SomeCommand >> SomeFile.txt
Bunu stderr
da kullanmak istersen :
SomeCommand &> SomeFile.txt
veya bunu eklemek için:
SomeCommand &>> SomeFile.txt
Konsolda ve bir dosyada hem stderr
çıktısını hem de çıktısını görüntülemek istiyorsanız, şunu kullanın:
SomeCommand 2>&1 | tee SomeFile.txt
(Yalnızca çıktıyı istiyorsanız, 2
yukarıdakileri bırakın )
make
komutun çıktısını bir dosyaya almak için bunun yerine bu sözdizimini gerektirir: make > someFile.txt 2>&1
(kaynak: linuxquestions.org/questions/linux-newbie-8/… )
Bir komutun çıktısını bir dosyaya yazmak için, temel olarak 10 yaygın şekilde kullanılan yol vardır.
Lütfen
n.e.
sözdizimi sütununda "mevcut değil" anlamına geldiğini unutmayın .
Bir yol var, ancak sütuna sığmayacak kadar karmaşık. Bu konuda Liste bölümünde yararlı bir bağlantı bulabilirsiniz.
|| visible in terminal || visible in file || existing
Syntax || StdOut | StdErr || StdOut | StdErr || file
==========++==========+==========++==========+==========++===========
> || no | yes || yes | no || overwrite
>> || no | yes || yes | no || append
|| | || | ||
2> || yes | no || no | yes || overwrite
2>> || yes | no || no | yes || append
|| | || | ||
&> || no | no || yes | yes || overwrite
&>> || no | no || yes | yes || append
|| | || | ||
| tee || yes | yes || yes | no || overwrite
| tee -a || yes | yes || yes | no || append
|| | || | ||
n.e. (*) || yes | yes || no | yes || overwrite
n.e. (*) || yes | yes || no | yes || append
|| | || | ||
|& tee || yes | yes || yes | yes || overwrite
|& tee -a || yes | yes || yes | yes || append
command > output.txt
Standart çıkış akışı sadece dosyaya yönlendirilecek, terminalde görünmeyecek. Dosya zaten varsa, üzerine yazılır.
command >> output.txt
Standart çıkış akışı sadece dosyaya yönlendirilecek, terminalde görünmeyecek. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.
command 2> output.txt
Standart hata akışı sadece dosyaya yönlendirilecek, terminalde görünmeyecek. Dosya zaten varsa, üzerine yazılır.
command 2>> output.txt
Standart hata akışı sadece dosyaya yönlendirilecek, terminalde görünmeyecek. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.
command &> output.txt
Hem standart çıktı hem de standart hata akışı yalnızca dosyaya yönlendirilecek, terminalde hiçbir şey görünmeyecek. Dosya zaten varsa, üzerine yazılır.
command &>> output.txt
Hem standart çıktı hem de standart hata akışı yalnızca dosyaya yönlendirilecek, terminalde hiçbir şey görünmeyecek. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.
command | tee output.txt
Standart çıkış akışı dosyaya kopyalanacak, terminalde görünmeye devam edecektir. Dosya zaten varsa, üzerine yazılır.
command | tee -a output.txt
Standart çıkış akışı dosyaya kopyalanacak, terminalde görünmeye devam edecektir. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.
(*)
Bash'in sadece StdErr'yi ikinci bir komutla borulamayı sağlayan kısa bir sözdizimi yoktur, burada tee
tabloyu tamamlamak için tekrar burada bir arada kullanılması gerekir . Eğer böyle bir şeye gerçekten ihtiyacınız varsa, lütfen "stderr nasıl kullanılır, stdout değil mi?" Konusuna bakın. Yığın Taşması üzerine , örneğin akışları değiştirerek veya işlem değiştirme kullanarak bunun nasıl yapılabileceği hakkında bilgi edinin.
command |& tee output.txt
Hem standart çıktı hem de standart hata akışları, dosyada hala terminalde görünür durumdayken kopyalanacaktır. Dosya zaten varsa, üzerine yazılır.
command |& tee -a output.txt
Hem standart çıktı hem de standart hata akışları, dosyada hala terminalde görünür durumdayken kopyalanacaktır. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.
2>&1
STDERR'yi STDOUT'a yönlendirir, STDOUT'u STDERR'ye 1>&2
yönlendirir ve 3>&1
akış 3'ü STDERR'ye yönlendirir.
sh: 1: Syntax error: "&" unexpected
kullandığımda |& tee
. Farklı bir kabuk kullanılıyor gibi görünüyor. 4.3.11 (1) sürümünü echo $SHELL
gösterir /bin/bash
ve $SHELL --version
gösterir. #!/bin/bash
Python senaryomda denedim ama hala alıyorum sh: 1: Syntax error
. İhtiyacım olanı aldım, bu yüzden sunucumdaki sh
ve bash
sunucudaki garipliği sıraya koymaktan vazgeçiyorum . Teşekkürler.
sh
değil bash
(ya da belki bash
de sh
... mod). Şu anki kabuk işleminizin tam olarak ne kullandığını kontrol edebilirsiniz ps -p $$ -o cmd=
, çünkü echo $SHELL
güvenilir değildir ve farklı bir alt kabuk başlatıp başlatmayacağınızı göz ardı ederek size giriş kabuğunuzu gösterir.
tee
Çıktıyı bir dosyaya göndermek için de kullanabilirsiniz :
command | tee ~/outputfile.txt
Küçük bir değişiklik de stderr'i yakalayacaktır:
command 2>&1 | tee ~/outputfile.txt
veya biraz daha kısa ve daha az karmaşık:
command |& tee ~/outputfile.txt
tee
Ayrıca canlı görüntülerken komut çıktısını yakalayabilmek istiyorsanız kullanışlıdır .
2>&1
?
Komut çıkışını bir dosyaya yönlendirebilirsiniz:
your_command >/path/to/file
Komut çıkışını üzerine yazmak yerine bir dosyaya eklemek için, şunu kullanın:
your_command >>/path/to/file
Dikkate alınması gereken bir geliştirme -
Çeşitli komut dosyaları, log dosyanızı karıştırmak istemeyebileceğiniz çıktılara renk kodları ekleyecektir.
Bunu düzeltmek için, bu kodları çıkarmak için sed programını kullanabilirsiniz . Örnek:
command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
ls
ve grep
destek --color=auto
standart çıkış terminali yalnızca renk kodları üretir.
İçin cron
işler vb Eğer Bash uzantıları kaçınmak istiyorum. Eşdeğer POSIX sh
yönlendirme operatörleri
Bash POSIX
------------ --------------
foo &> bar foo >bar 2>&1
foo &>> bar foo >>bar 2>&1
foo |& bar foo 2>&1 | bar
POSIX tesisinin bir anlamda daha basit ve daha basit olduğunu fark edeceksiniz. &>
Sözdizimi ödünç oldu csh
zaten kötü bir fikir olduğuna sizi ikna gereken.
some_command | tee command.log
ve some_command > command.log
komut çıkışını command.log
gerçek zamanlı olarak dosyaya kaydetmemeleri sorununu yaşayın.
Bu sorunu önlemek ve komut çıkışını gerçek zamanlı olarak kaydetmek için unbuffer
, paketle birlikte gelen ekleri ekleyebilirsiniz expect
.
Örnek:
sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log
Varsayalım ki log.py
:
import time
print('testing')
time.sleep(100) # sleeping for 100 seconds
koşabilirsin unbuffer python log.py | tee command.log
ya daunbuffer python log.py > command.log
Ek bilgi: Komut çıktısını bir dosyaya gerçek zamanlı olarak nasıl kaydederim?
someCommand 2> someFile.txt
vesomeCommand 2>> someFile.txt
ayrıcastterr
someFile.txt dosyasına yönlendirir