Nasıl bir dosya için bir komut çıktısını kaydedebilirim?
Herhangi bir yazılım kullanmadan bir yolu var mı? Nasıl yapılacağını bilmek istiyorum.
Nasıl bir dosya için bir komut çıktısını kaydedebilirim?
Herhangi bir yazılım kullanmadan bir yolu var mı? Nasıl yapılacağını bilmek istiyorum.
Evet, bu mümkün, sadece çıktıyı yönlendirin (AKA stdout
bir dosya için :
SomeCommand > SomeFile.txt
Veya veri eklemek istiyorsanız:
SomeCommand >> SomeFile.txt
Eğer isterseniz stderr
bunu da kullan:
SomeCommand &> SomeFile.txt
ya da bunu eklemek için:
SomeCommand &>> SomeFile.txt
eğer ikisine de sahip olmak istiyorsan stderr
ve çıktı konsolda görüntülenir ve bir dosyada bunu kullan:
SomeCommand 2>&1 | tee SomeFile.txt
(Yalnızca çıktıyı istiyorsanız, bırakın 2
üzerinde)
Bir komutun çıktısını bir dosyaya yazmak için temel olarak yaygın olarak kullanılan 10 yol vardır.
Lütfen unutmayın
n.e.
sözdizimi sütununda "mevcut değil" anlamına gelir.
Bir yolu var, ama sütuna sığmayacak kadar karmaşık. Bununla ilgili 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 çıktı akışı yalnızca dosyaya yönlendirilecek, terminalde görünmeyecektir. Dosya zaten varsa, üzerine yazılır.
command >> output.txt
Standart çıktı akışı yalnızca dosyaya yönlendirilecek, terminalde görünmeyecektir. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.
command 2> output.txt
Standart hata akışı yalnızca dosyaya yönlendirilir, terminalde görünmez. Dosya zaten varsa, üzerine yazılır.
command 2>> output.txt
Standart hata akışı yalnızca dosyaya yönlendirilir, terminalde görünmez. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.
command &> output.txt
Hem standart çıktı hem de standart hata akışı yalnızca dosyaya yönlendirilir, terminalde hiçbir şey görünmez. Dosya zaten varsa, üzerine yazılır.
command &>> output.txt
Hem standart çıktı hem de standart hata akışı yalnızca dosyaya yönlendirilir, terminalde hiçbir şey görünmez. 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 , yalnızca stderr'yi ikinci bir komuta yönlendirmeye izin veren bir steno sözdizimine sahip değildir; bu, burada aşağıdakilerle birlikte gerekli olacaktır tee
yine masayı tamamlamak için. Gerçekten böyle bir şeye ihtiyacınız varsa, lütfen bakın "Nasıl stderr boru ve stdout değil?" yığın Taşması üzerine bunun nasıl yapılabileceğinin bazı yolları için, örneğin akışları değiştirerek veya işlem değiştirmeyi kullanarak.
command |& tee output.txt
Hem standart çıktı hem de standart hata akışları, terminalde görünmeye devam ederken dosyaya kopyalanır. Dosya zaten varsa, üzerine yazılır.
command |& tee -a output.txt
Hem standart çıktı hem de standart hata akışları, terminalde görünmeye devam ederken dosyaya kopyalanır. Dosya zaten varsa, yeni veriler dosyanın sonuna eklenir.
Ayrıca şunları da kullanabilirsiniz tee
çıktıyı bir dosyaya göndermek için:
command | tee ~/outputfile.txt
Küçük bir değişiklik de stderr'yi yakalayacaktır:
command 2>&1 | tee ~/outputfile.txt
veya biraz daha kısa ve daha az karmaşık:
command |& tee ~/outputfile.txt
tee
bunu yapabilmek istiyorsanız kullanışlıdır. komut çıktısını canlı görüntülerken yakalayın.
Komut çıktısını bir dosyaya yönlendirebilirsiniz:
your_command >/path/to/file
Komut çıktısını üzerine yazmak yerine bir dosyaya eklemek için:
your_command >>/path/to/file
Bir donanım dikkate -
Çeşitli komut dosyaları, günlük dosyanızı karıştırmak istemeyebileceğiniz çıktıya renk kodları enjekte eder.
Bunu düzeltmek için programı kullanabilirsiniz sed o kodları çıkarmak için. Örnek:
command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
Burada iki farklı soru var. Birincisi başlıkta:
Terminal çıktısını bir dosyaya nasıl kaydederim?
İkinci soru bedende:
Nasıl bir dosya için bir komut çıktısını kaydedebilirim?
Burada yayınlanan tüm cevaplar ikinci soruyu ele alıyor, ancak hiçbiri harika bir cevabı olan ilk soruyu ele almıyor. Unix ve Linux:
Bu cevap, az bilinen bir komut kullanır script
siz yazana kadar tüm kabuğunuzun çıktısını bir metin dosyasına kaydeder exit
. Komut çıktısı hala ekranınızda görünür, ancak metin dosyasında da görünür.
İşlem basittir. Kullanmak:
$ script ~/outputfile.txtScript started, file is /home/rick/outputfile.txt$ command1$ command2$ command3$ exitexitScript done, file is /home/rick/outputfile.txt
Ardından, 1, 2 ve 3 komutlarının kaydedilmiş çıktısına bakın:
cat ~/outputfile.txt
Bu şuna benzer önceki cevap -den:
command |& tee ~/outputfile.txt
|& tee ~/outputfile.txt
her birinden sonra commnd
.script
komut, yeniden yüklemenin avantajını (veya dezavantajını) ekledi ~/.bashrc
ne zaman başlıyor.script
komut, komut istemini gösterir ($PS1
) girdiğiniz komut (lar) ı takip eder.script
komut tüm ayrıntıları tam renkli olarak kaydeder.İçin cron
işler vb. Bash uzantılarından kaçınmak istersiniz. Eşdeğer POSIX sh
yönlendirme operatörleri şunlardır
Bash POSIX------------ --------------foo &> bar foo >bar 2>&1foo &>> bar foo >>bar 2>&1foo |& bar foo 2>&1 | bar
POSIX tesisinin bir anlamda daha basit ve anlaşılır olduğunu fark edeceksiniz. Bu &>
sözdizimi ödünç alındı csh
bu da seni zaten bunun kötü bir fikir olduğuna ikna etmeli.
some_command | tee command.log
ve some_command > command.log
komut çıktısını kaydetmemeleri sorunu var command.log
gerçek zamanlı olarak dosyalayın.
Bu sorunu önlemek ve komut çıktısını gerçek zamanlı olarak kaydetmek için şunları ekleyebilirsiniz unbuffer
bu gelir expect
paket.
Örnek:
sudo apt-get install expectunbuffer some_command | tee command.logunbuffer some_command > command.log
Varsayarak log.py
içeriyor:
import timeprint('testing')time.sleep(100) # sleeping for 100 seconds
çalıştırabilirsiniz unbuffer python log.py | tee command.log
veya unbuffer python log.py > command.log
Daha fazla bilgi: Komut çıktısını bir dosyaya gerçek zamanlı olarak nasıl kaydedebilirim?
Komut çalıştırılırken dosyaya çıktı almak istiyorsanız:
script -c ./path/to/executable.bash -f log.txt