Bir terminal komutunun (Bash) çıktısı bir metin dosyasına nasıl kaydedilir. Standart girdi/çıktı akışlarını yeniden yönlendirme Standart çıktıyı bir dosyaya yeniden yönlendirme

Sistemde, varsayılan olarak, üç "dosya" her zaman açıktır - (klavye), (ekran) ve (ekranda hata mesajlarını görüntüleme). Bunlar ve diğer açık dosyalar yeniden yönlendirilebilir. Bu durumda, "yeniden yönlendirme" terimi, bir dosyadan, komuttan, programdan, komut dosyasından veya hatta bir komut dosyasındaki ayrı bir bloktan çıktı almak (bkz. Örnek 3-1 ve Örnek 3-2) ve bunu girdiye başka bir girdiye aktarmak anlamına gelir. dosya, komut, program veya komut dosyası.

Her açık dosyanın kendisiyle ilişkilendirilmiş bir dosya tanımlayıcısı vardır. Dosya tanımlayıcıları ve sırasıyla 0, 1 ve 2'dir. Ek dosyalar açıldığında, 3'ten 9'a kadar olan tanımlayıcılar boş kalır. Bazen ek tanımlayıcılar, veya öğesine geçici olarak bir başvuru depolayarak iyi bir iş çıkarabilir. Bu, karmaşık yeniden yönlendirme ve permütasyon manipülasyonlarından sonra tanıtıcıları normal durumlarına döndürmeyi kolaylaştırır (bkz. Örnek 16-1).

COMMAND_OUTPUT> # stdout (çıktı) bir dosyaya yönlendiriliyor. # Dosya eksikse oluşturulur, aksi takdirde üzerine yazılır. ls -lR> dir-tree.list # Bir dizin ağacı listesi içeren bir dosya oluşturur. :> dosyaadı #> işlemi, "dosyaadı" dosyasını sıfır uzunlukta keser. # İşlemden önce dosya mevcut değilse, # sıfır uzunlukta yeni bir dosya oluşturulur (aynı etki "dokunma" komutuyla da verilir). # Symbol: Burada hiçbir çıktı vermeden yer tutucu görevi görür. > dosyaadı #> işlemi, "dosyaadı" dosyasını sıfır uzunlukta keser. # İşlemden önce dosya mevcut değilse, # sıfır uzunlukta yeni bir dosya oluşturulur (aynı etki "dokunma" komutuyla da verilir). # (yukarıdakiyle aynı sonuç - ":>", ancak bu seçenek bazı kabuklarda # çalışmaz.) COMMAND_OUTPUT >> # stdout'u (çıktı) bir dosyaya yeniden yönlendirme. # Yok ise yeni bir dosya oluşturur, aksi takdirde - dosyanın sonuna ekler. # Tek satırlı yönlendirme komutları # (yalnızca gerçekleştikleri satırı etkiler): # ————————————————————————————— ———— 1> dosya adı # "dosya adı" dosyasına çıktı yönlendirmesi (stdout). 1 >> filename # Çıktıyı (stdout) "filename" dosyasına yönlendirin, dosya ekleme modunda açılır. 2> dosyaadı # stderr'i "dosyaadı"na yönlendirin. 2 >> dosyaadı # stderr'i "dosya adı" dosyasına yönlendirin, dosyayı ekleme modunda açın. &> dosyaadı # stdout ve stderr'yi "dosyaadı"na yönlendir. # =============================================== ============================== # Yalnızca bir satır için stdout'u yeniden yönlendirme. LOGFILE = script.log echo "Bu satır \" $ LOGFILE \ " dosyasına yazılacak." 1> $ LOGFILE echo "Bu satır \" $ LOGFILE \ "dosyasının sonuna eklenecektir." 1 >> $ LOGFILE echo "Bu satır ayrıca \" $ LOGFILE \ "dosyasının sonuna eklenecektir." 1 >> $ LOGFILE echo "Bu satır ekrana yazdırılacak ve \" $LOGFILE \ " dosyasına gitmeyecek." # Her satırdan sonra yapılan yönlendirme otomatik olarak "temizlenir". # Yalnızca bir satır için stderr'yi yeniden yönlendir. ERRORFILE = script.errors bad_command1 2> $ ERRORFILE # Hata mesajı $ ERRORFILE'a yazılacaktır. bad_command2 2 >> $ ERRORFILE # Hata mesajı $ ERRORFILE'ın sonuna eklenecek. bad_command3 # Hata mesajı stderr'e yazdırılacak, # + ve $ ERRORFILE'a gitmeyecek. # Her satırdan sonra yapılan yönlendirme de otomatik olarak "temizlenir". # =============================================== ============================ 2> & 1 # stderr'i stdout'a yönlendirir. # Hata mesajları standart çıktı olarak aynı yere gönderilir. ben> ben v J... # Tanımlayıcı ile dosyaya çıktı ben tanımlayıcı ile dosyaya geçti J... > & j # Tanımlayıcılı dosyayı yeniden yönlendir 1 (stdout) tanımlayıcı ile dosyaya J... # stdout'a çıktı, tanımlayıcı ile dosyaya aktarılır J. 0< FILENAME < FILENAME # Ввод из файла. # Парная команде ">", genellikle onunla birlikte. # # grep search-word dosyaadı # Dosya "dosyaadı" okuma ve yazma için açılır ve "j" tanımlayıcısı ile ilişkilendirilir. # Dosya adı eksikse oluşturulur. # "j" tanımlayıcısı belirtilmemişse, varsayılan olarak 0 tanımlayıcısı, stdin kullanılır. # # Bunun bir kullanımı, bir dosyada belirli bir konuma yazmaktır. echo 1234567890> Dosya # "Dosya" dosyasına satır yazın. yürütme 3<>Dosya # "Dosya" yı açın ve işleme 3'e bağlantı verin. read -n 4<&3 # Прочитать 4 символа. echo -n . >& 3 # Nokta karakterini yazın. exec 3> & - # Tanımlayıcıyı kapat 3. cat Dosyası # ==> 1234.67890 # Rastgele erişim ve daha fazlası! | # Konveyör (kanal). # Komutları tek bir zincirde birleştirmek için evrensel bir araç. # ">" ile benzer, ancak aslında daha kapsamlı. # Komutları, komut dosyalarını, dosyaları ve programları tek bir zincirde (pipeline) birleştirmek için kullanılır. kedi * .txt | sıralama | uniq> sonuç dosyası # Tüm .txt dosyalarının içeriği sıralanır, yinelenen satırlar kaldırılır, # sonuç "sonuç dosyası" dosyasına kaydedilir.

Yönlendirme işlemleri ve/veya boru hatları tek bir komut satırında birleştirilebilir.

emretmek< input-file >çıktı dosyası komutu1 | komut2 | komut3> çıktı dosyası Bkz. Örnek 12-23 ve Örnek A-17.

Birden çok akışı tek bir dosyaya yönlendirmeye izin verilir.

ls -yz >> command.log 2> & 1 # "ls" komutunda geçersiz bir "yz" seçeneği ile ilgili bir mesaj "command.log" dosyasına yazılacaktır. # Stderr bir dosyaya yönlendirildiğinden beri.

Dosya tanımlayıcılarını kapatma

Giriş dosyasına giden tutamacı kapatın.

0<&-, <&-

Çıktı dosyasına giden tutamacı kapatın.

1>&-, >&-

Alt süreçler, açık dosya tanımlayıcılarını devralır. Bu nedenle konveyörler çalışır. Tanımlayıcıların devralınmasını önlemek için alt işleme başlamadan önce bunları kapatın.

# Pipeline sadece stderr iletilir. exec 3> & 1 # stdout'un mevcut "durumunu" kaydedin. ls -l 2> & 1> & 3 3> & - | grep kötü 3> & - # Açıklamayı kapat. grep için 3 (ancak ls değil). # ^^^^ ^^^^ exec 3> & - # Komut dosyasının geri kalanı için şimdi kapatın. # Teşekkürler S.C.

G/Ç'yi yeniden yönlendirme hakkında daha fazla bilgi için Ek D'ye bakın.

16.1. Komutu kullanma yürütmek

Emretmek yürütmek girdiyi bir dosyaya yönlendirir. Şu andan itibaren, tüm girdiler (genellikle klavye) bu dosyadan yapılacaktır. Bu, bir dosyanın içeriğini satır satır okumayı ve sed ve/veya awk kullanılarak girilen her satırı ayrıştırmayı mümkün kılar.

Örnek 16-1. exec ile yönlendirme

#! / bin / bash # stdin'i "exec" ile yönlendirme. yürütme 6<&0 # Связать дескр. #6 со стандартным вводом (stdin). # Сохраняя stdin. exec < data-file # stdin заменяется файлом "data-file" read a1 # Читается первая строка из "data-file". read a2 # Читается вторая строка из "data-file." echo echo "Следующие строки были прочитаны из файла." echo "——————————————" echo $a1 echo $a2 echo; echo; echo exec 0<&6 6<&- # Восстанавливается stdin из дескр. #6, где он был предварительно сохранен, #+ и дескр. #6 закрывается (6<&-) освобождая его для других процессов. # # <&6 6<&- дает тот же результат. echo -n "Введите строку " read b1 # Теперь функция "read", как и следовало ожидать, принимает данные с обычного stdin. echo "Строка, принятая со stdin." echo "—————————" echo "b1 = $b1" echo exit 0

Benzer şekilde, inşaat exec> dosya adıçıktıyı belirtilen dosyaya yönlendirir. Bundan sonra, normalde yönlendirilecek olan komutların tüm çıktıları artık bu dosyaya gönderilir.

Örnek 16-2. exec ile yönlendirme

#! / bin / bash # reassign-stdout.sh LOGFILE = logfile.txt exec 6> & 1 # Bağlantı tanımlayıcı # 6 stdout'tan. # stdout'u tutmak. exec> $ LOGFILE # stdout "logfile.txt" ile değiştirilir. # ———————————————————— # # Bu bloktaki tüm komut çıktıları $LOGFILE dosyasına yazılır. echo -n "Günlük dosyası:" tarih echo "———————————-" echo echo "\" ls -al \ "" komutunun çıktısı echo ls -al echo; echo "Çıkış \" df \ "" echo df # ———————————————————— # exec 1> & 6 6> & - # Stdout'u geri yükleyin ve açıklamayı kapatın . # 6. echo echo "== stdout varsayılana geri yüklendi ==" echo ls -al echo çıkış 0

Örnek 16-3. Eşzamanlı cihaz yeniden yönlendirme ve exec komutunu kullanarak

#! / bin / bash # üstkonv.sh # Girdi dosyasındaki karakterleri büyük harfe dönüştürün. E_FILE_ACCESS = 70 E_WRONG_ARGS = 71 ise [! -r "$ 1"] # Dosya okunabilir mi? ardından echo "Verilen dosyadan okunamıyor!" echo "Kullanım sırası: $ 0 girdi dosyası çıktı dosyası" exit $ E_FILE_ACCESS fi # Herhangi bir girdi dosyası ($ 1) belirtilmemişse # + çıkış kodu aynı olacaktır. [-z "$ 2"] ise echo "Çıktı dosyası belirtilmelidir." echo "Kullanım sırası: $ 0 girdi dosyası çıktı dosyası" çıkış $ E_WRONG_ARGS fi exec 4<&0 exec < $1 # Назначить ввод из входного файла. exec 7>& 1 exec> $ 2 # Çıktıyı çıktı dosyasına atayın. # Çıktı dosyasının yazılabilir olduğunu varsayar # (kontrol ekle?). # ——————————————— kedi - | tr a-z A-Z # Büyük harf dönüştürme # ^^^^^ # Stdin'den okuyun. # ^^^^^^^^^^ # stdout'a yaz. # Ancak, hem stdin hem de stdout yeniden yönlendirildi. # ———————————————— exec 1> & 7 7> & - # Stdout'u geri yükleyin. yürütme 0<&4 4<&- # Восстановить stdin. # После восстановления, следующая строка выводится на stdout, чего и следовало ожидать. echo "Символы из \"$1\" преобразованы в верхний регистр, результат записан в \"$2\"." exit 0

Sonraki: Hataları bir dosyaya yönlendirme Yukarı: G / Ç yönlendirmesi Öncesi: Bir dosyadan girişi yeniden yönlendirme İçindekiler dizin

Çıktıyı bir dosyaya yönlendirme

Standart çıktıyı bir dosyaya yönlendirmek için `> 'operatörünü kullanın.

Linux G/Ç yeniden yönlendirmesi

Komut adından sonra > operatörünü ve ardından çıktı hedefi olarak hizmet edecek dosyanın adını kullanın. Örneğin, program sonuçlarının çıktısını bir dosyaya yazmak için şunu girin:

Standart çıktıyı mevcut bir dosyaya yönlendirirseniz, baştan üzerine yazılır. Mevcut bir dosyanın içeriğine standart çıktı eklemek için `'' operatörünü kullanmalısınız. Örneğin, program yeniden başlatıldığında çalışmanın sonuçlarını dosyaya eklemek için şunu girin:

Alex Otwagin 2002-12-16

Bir program genellikle verileri işleyebilmesi açısından değerlidir: birini al, diğerini çıkar ve hemen hemen her şey veri olarak hareket edebilir: metin, sayılar, ses, video ... Bir komut için giriş ve çıkış veri akışlarına denir. giriş ve çıktı... Her programın birkaç giriş ve çıkış akışı olabilir. Her süreçte, yaratma üzerine, hatasız olarak sözde alır. standart giriş(standart giriş, stdin) ve standart(standart çıktı, stdout) ve standart hata çıktısı(standart hata, stderr).

Standart G/Ç akışları, öncelikle metinsel bilgi alışverişi için tasarlanmıştır. Metinlerin yardımıyla kimin iletişim kurduğu bile önemli değil: kendi aralarında bir programı veya programı olan bir kişi - ana şey, bir veri iletim kanalına sahip olmaları ve "aynı dili" konuşmalarıdır.

Makineyle çalışmanın metinsel ilkesi, tek bir sistem göz önüne alındığında, sistem klavyesi ve monitörlü video kartı gibi bilgisayarın belirli bölümlerinden dikkatinizi dağıtmanıza olanak tanır. terminal cihazı, kullanıcının metin (komutlar) girip sisteme aktardığı ve sistem, kullanıcı için gerekli verileri ve mesajları (teşhis ve hatalar) görüntüler. Böyle bir cihaz denir terminal... Genel olarak, bir terminal, metin bilgilerini iletme yeteneğine sahip olan bir kullanıcının sisteme giriş noktasıdır. Bir terminal, bir seri veri bağlantı noktası aracılığıyla bir bilgisayara bağlanan ayrı bir harici aygıt olabilir (kişisel bilgisayarda buna "COM bağlantı noktası" denir). Bir program (örneğin, xterm veya ssh) bir terminal rolünde de çalışabilir (sistemden biraz destek alarak). Nihayet, sanal konsollar- ayrıca terminaller, yalnızca modern bir bilgisayarın uygun cihazlarının yardımıyla programlı olarak düzenlenir.

Komut satırıyla çalışırken, kabuk standart girişi klavyeyle, standart ve hata çıkışı ise monitör ekranıyla (veya terminal öykünücü penceresiyle) ilişkilendirilir. En basit komut örneği ile gösterelim - cat. Genellikle komut kedi parametreleri olarak belirtilen tüm dosyalardan verileri okur ve okumayı doğrudan standart çıktıya (stdout) gönderir. Bu nedenle komut

/ ana sayfa / larry / makaleler # kedi tarihi-final yüksek lisans tezi

önce dosyanın içeriğini, ardından dosyayı görüntüler.

Ancak, dosya adı belirtilmemişse, program kedi stdin'den girdi okur ve hemen stdout'a döndürür (hiçbir şekilde değiştirmeden). Veriler geçiyor kedi bir borudan geçmek gibi. İşte bir örnek:

/ ana sayfa / larry / makaleler # kedi Merhaba. Selamlar. Hoşçakal. Hoşçakal. CtrlNS/ ana sayfa / larry / makaleler #

Klavyeden girdiğiniz her satır cat tarafından anında ekrana döndürülür. Standart girişten bilgi girilirken, metnin sonu özel bir tuş kombinasyonu girilerek bildirilir, genellikle CtrlNS.

Başka bir örnek alalım. Emretmek çeşit girdi metninin satırlarını okur (dosya adı belirtilmemişse stdin'den de) ve bu satırlardan oluşan bir diziyi sıralı biçimde stdout'a yazdırır. Etkisini kontrol edelim.

/ ana sayfa / larry / kağıtlar # muzları sırala havuçlar elmalar Ctrl + D elmalar muzlar havuçlar / ana sayfa / larry / kağıtlar #

Gördüğünüz gibi, tıkladıktan sonra CtrlNS, çeşit satırları alfabetik olarak yazdırdı.

Standart giriş ve standart çıkış

Alfabetik bir listeyi diske kaydetmek için sort komutunun çıktısını bir dosyaya aktarmak istediğinizi varsayalım. Komut kabuğu, sembolü kullanarak bir komutun standart çıktısını bir dosyaya yeniden yönlendirmenizi sağlar. İşte bir örnek:

/ ana sayfa / larry / gazeteler # sırala> alışveriş listesi muzlar havuçlar elmalar CtrlNS/ ana sayfa / larry / makaleler #

sort komutunun çıktısının ekrana yazdırılmadığını, ancak adlı bir dosyaya kaydedildiğini görebilirsiniz. Bu dosyanın içeriğini gösterelim:

/ ana sayfa / larry / kağıtlar # kedi alışveriş listesi elma muz havuç / ana sayfa / larry / kağıtlar #

Şimdi orijinal sırasız listenin bir dosyada olduğunu varsayalım. Bu liste komutu kullanılarak yeniden sıralanabilir. çeşit ona standart girdisinden değil de verilen dosyadan okuması gerektiğini söylerseniz ve ayrıca standart çıktıyı yukarıda yapıldığı gibi bir dosyaya yönlendirirseniz. Örnek:

/ ana sayfa / larry / kağıtlar # öğeleri alışveriş listesi / ev / larry / kağıtlar # kedi alışveriş listesi elma muz havuç / ev / larry / kağıtlar #

Ancak, yalnızca standart çıktıyı değil, aynı zamanda standart giriş simgeyi kullanan bir dosyadan yardımcı programlar:

/ ana sayfa / larry / makaleler # sıralama< items apples bananas carrots /home/larry/papers#

Komut Sonucu çeşit< items komuta eşdeğer öğeleri sırala, ancak bunlardan ilki aşağıdakileri gösterir: komutu verirken çeşit< items sistem, dosyada bulunan veriler standart girdiden girilmiş gibi davranır. Yönlendirme kabuk tarafından yapılır. Takım çeşit dosya adı bildirilmedi: bu komut, standart girdisinden verileri sanki klavyeden giriyormuşuz gibi okudu.

Konsepti tanıtalım filtre... Filtre, standart girdiden veri okuyan, bir şekilde işleyen ve sonucu standart çıktıya gönderen bir programdır. Yeniden yönlendirme kullanıldığında, dosyalar standart girdi ve çıktı olarak kullanılabilir. Yukarıda belirtildiği gibi, varsayılan olarak stdin ve stdout sırasıyla klavye ve ekranı ifade eder. Sıralama programı basit bir filtredir — girdiyi sıralar ve sonucu standart çıktıya gönderir. Çok basit bir filtre programdır kedi- girdi verileriyle hiçbir şey yapmaz, sadece çıktıya gönderir.

Sıralama programının filtre olarak nasıl kullanılacağını yukarıda zaten gösterdik. Bu örnekler, orijinal verilerin bir dosyada olduğunu veya orijinal verilerin klavyeden girileceğini (standart giriş) varsayıyordu. Ancak, başka bir komutun sonucu olan verileri sıralamak isterseniz, örneğin, ls?

Verileri ters alfabetik sıraya göre sıralayacağız; bu komuta bir seçenek olarak yapılır çeşit... Geçerli dizindeki dosyaları ters alfabetik sırayla listelemek istiyorsanız, bunu yapmanın bir yolu şudur.

G / Ç yönlendirmesi

Önce komutu uygulayalım ls:

/ ana sayfa / larry / makaleler # ls ingilizce listesi tarih-final yüksek lisans tezi notları / ana sayfa / larry / makaleler #

Şimdi komut çıktısını yeniden yönlendirin ls file-list adlı bir dosyaya

/ ana sayfa / larry / makaleler # ls> dosya listesi / ana sayfa / larry / makaleler # sort -r dosya listesi notları yüksek lisans tezi tarihi-final ingilizce listesi / ana sayfa / larry / makaleler #

İşte komut çıktısı ls bir dosyaya kaydedildi ve bundan sonra bu dosya komut tarafından işlendi. çeşit... Ancak bu yol hantaldır ve programın çıktısını depolamak için geçici bir dosyanın kullanılmasını gerektirir. ls.

Bu durumda çözüm, yaratmaktır. demirlemiş ekipler(boru hatları). Yerleştirme, ilk komutun stdout'unu ikinci komutun stdin'ine yönlendiren komut kabuğu tarafından gerçekleştirilir. Bu durumda, komutun stdout'unu aktarmak istiyoruz. ls komutun stdin'ine çeşit... Bağlantı istasyonu, aşağıdaki örnekte gösterildiği gibi bir sembol kullanır:

/ ana sayfa / larry / gazeteler # ls | sort -r yüksek lisans tezi tarihi-final ingilizce listesi / ana sayfa / larry / makaleler #

Bu komut, bir dizi komuttan daha kısadır ve yazılması daha kolaydır.

Başka bir yararlı örneğe bakalım. Emretmek

/ ana sayfa / larry / kağıtlar # ls / usr / bin

uzun bir dosya listesi üretir. Bu listenin çoğu, bu listenin içeriğinin okunması için ekranda çok hızlı uçar. Bu listeyi parçalar halinde görüntülemek için more komutunu kullanmayı deneyelim:

/ ana sayfa / larry / kağıtlar # ls / usr / bin | daha fazla

Şimdi bu listeyi "ters çevirebilirsiniz".

Daha ileri gidebilir ve ikiden fazla takımı kenetleyebilirsiniz. Komutu düşünün kafa, aşağıdaki özelliğin bir filtresidir: giriş akışından ilk satırları çıkarır (bizim durumumuzda giriş, birkaç yerleşik komutun çıkışı olacaktır). Geçerli dizindeki son alfabetik dosya adını görüntülemek istiyorsak, aşağıdaki uzun komutu kullanabiliriz:

/ ana sayfa / larry / gazeteler # ls | sıralama -r | kafa -1 notlar / ev / larry / kağıtlar \ #

takım nerede kafa aldığı satırların giriş akışının ilk satırını görüntüler (bizim durumumuzda akış, komuttan gelen verilerden oluşur) ls) ters alfabetik sıraya göre sıralanmıştır.

Birleştirilmiş Komutları Kullanma (Boru Hattı)

Bir dosyanın çıktısını yeniden yönlendirmek için bir karakter kullanmanın etkisi yıkıcıdır; başka bir deyişle, komut

/ ana sayfa / larry / makaleler # ls> dosya listesi

dosya daha önce mevcutsa dosyanın içeriğini yok edecek ve yerine yeni bir dosya oluşturacaktır.

Yönlendirme bunun yerine karakterler kullanılarak yapılırsa, çıktı, dosyanın orijinal içeriği yok edilmeden belirtilen dosyanın sonuna eklenir. Örneğin, komut

/ ana sayfa / larry / makaleler # ls >> dosya listesi

komutun çıktısını atar ls dosyanın sonuna.

Hem giriş hem de çıkış yeniden yönlendirmesinin ve komut birleştirmenin, ve karakterlerini destekleyen kabuklar tarafından gerçekleştirildiğini unutmayın. Komutların kendileri bu sembolleri algılayamaz ve yorumlayamaz.

Tahribatsız çıktı yönlendirmesi

Böyle bir şey yapmak istediğini yapmalı mı?

Şuna da bakın: wintee

Cygwin'e gerek yok.

Ancak, bazı sorunlarla karşılaştım ve bildirdim.

Ayrıca http://unxutils.sourceforge.net/ adresini kontrol edebilirsiniz çünkü tee içerir (ve cygwin'e ihtiyaç duymaz), ancak EOL çıktılarının UNIX benzeri olmasına dikkat edin.

Son olarak, PowerShell'iniz varsa Tee-Object'i deneyebilirsiniz. Daha fazla bilgi için PowerShell Konsolu yazın.

Bu biraz çirkin olsa da işe yarıyor:

Kendi yolunda çalıştığı için diğer bazı çözümlerden biraz daha esnektir, böylece eklemek için kullanabilirsiniz.

Bunu, mesajları günlüğe kaydetmek ve görüntülemek için toplu iş dosyalarında oldukça fazla kullanıyorum:

Evet, ECHO ifadesini tekrarlayabilirsiniz (bir kez ekran için ve ikinci kez günlük dosyasına yönlendirme), ancak bu aynı derecede kötü görünüyor ve bu bir bakım sorunu.

Giriş ve çıkışı yeniden yönlendirme

En azından bu şekilde, mesajlarda iki yerde değişiklik yapmanız gerekmez.

_ öğesinin yalnızca kısa bir dosya adı olduğunu unutmayın, bu nedenle toplu iş dosyanızın sonunda (bir toplu iş dosyası kullanıyorsanız) bu adı kaldırmanız gerekir.

Bu, geçerli saat ve saat ile bir günlük dosyası oluşturacaktır ve işlem sırasında konsol satırlarını kullanabilirsiniz.

Windows ortam yolunuzda cygwin varsa, şunları kullanabilirsiniz:

Basit bir C# konsol uygulaması işinizi görür:

Bunu kullanmak için, orijinal komutu programa iletmeniz ve çıktısını çoğaltmak istediğiniz dosyaların yolunu sağlamanız yeterlidir. Örneğin:

Arama sonuçlarını görüntüler ve sonuçları files1.txt ve files2.txt dosyalarına kaydeder.

Hata işleme yolunda çok fazla (hiçbir şey!) olmadığını ve birden çok dosya için destek gerekmeyebileceğini unutmayın.

Ben de aynı çözümü arıyordum, küçük bir denemeden sonra bunu komut satırında başarıyla yürütebildim. İşte benim çözümüm:

Hatta herhangi bir PAUSE takımını yakalar.

Bir alternatif, programınızdaki stderr için tee stdout'tur:

Ardından dos toplu iş dosyanızda:

Stdout günlük dosyasına gidecek ve konsolda stderr (aynı veri) görüntülenecektir.

Çıktı nasıl görüntülenir ve bir dosyaya yönlendirilir. Diyelim ki dir> test.txt dos komutunu kullanırsam, bu komut sonuçları görüntülemeden çıktıyı test.txt'ye yönlendirir. DOS, yani UNIX / LINUX değil Windows komut satırı kullanarak çıktı çıktısı almak ve çıktıyı bir dosyaya yönlendirmek için komut nasıl yazılır.

Bu komutları biterscripting'de (http://www.biterscripting.com) faydalı bulabilirsiniz.

Bu, önceki MTS yanıtının bir varyasyonudur, ancak diğerlerinin yararlı bulabileceği bazı işlevler ekler. İşte kullandığım yöntem:

  • Komut, komut penceresine çıkarılacak kodda daha sonra kullanılabilecek bir değişken olarak ayarlanır ve kullanılarak günlük dosyasına eklenir.
    • Ekip, başlangıçta değerlendirilmemesi için havuç sembolünü kullanarak yeniden yönlendirme yapmaktan kaçınır
  • Toplu iş dosyasının adını almak için komut satırı parametre genişletme sözdizimini kullanan bir toplu iş dosyasına benzer bir dosya adıyla geçici bir dosya oluşturulur.
  • Sonuç ayrı bir günlük dosyasına eklenir

İşte komutların sırası:

  1. Çıktı ve hata mesajları geçici bir dosyaya gönderilir
  2. Geçici dosyanın içeriği daha sonra:
    • günlük dosyasına eklendi
    • komut penceresine çıktı
  3. Geçici mesaj dosyası silindi

İşte bir örnek:

Böylece komut, daha temiz görünen bir toplu iş dosyasındaki sonraki komutlardan sonra eklenebilir:

Bu, diğer komutların sonuna da eklenebilir. Anlayabildiğim kadarıyla, mesajlar birden fazla satıra sahip olduğunda bu işe yarayacak. Örneğin, bir hata mesajı varsa aşağıdaki komut iki satır yazdırır:

Brian Rasmussen'e katılıyorum, unxutils portu bunu yapmanın en kolay yolu. Rob van der Woude, Komut Dosyası sayfalarının Toplu İş Dosyaları bölümünde, MS-DOS ve CMD komutlarının kullanımı hakkında zengin bilgiler sağlar. Sorununuz için kendi çözümü olabileceğini düşündüm ve orada TEE.BAT'ı araştırdıktan sonra, TEE.BAT'ın tam olarak böyle görünen bir MS-DOS dil paketi dil paketi olduğunu buldum. Bu oldukça karmaşık bir toplu iş dosyası ve unxutils bağlantı noktasını kullanma eğilimindeyim.

Perl'i makinelerimin çoğuna yüklüyorum, bu yüzden cevap Perl'de: tee.pl

yön | perl tee.pl veya dizin | perl tee.pl dir.bat

ham ve denenmemiş.

Hangi komut satırı komut dosyalarının çıktısı ile çalışmanın iki yöntemini zaten biliyorsunuz:

  • Çıktı verilerini ekranda görüntüleyin.
  • Çıktıyı bir dosyaya yönlendirme.
Bazen ekranda bir şeyin gösterilmesi ve bir dosyaya bir şeyin yazılması gerekir, bu nedenle Linux'ta girdi ve çıktının nasıl işlendiğini anlamanız gerekir, bu da komut dosyalarının sonuçlarını nereye göndereceğinizi öğrenmeniz gerektiği anlamına gelir. gerek. Standart dosya tanımlayıcıları hakkında konuşarak başlayalım.

Standart dosya tanımlayıcıları

Linux'taki her şey girdi ve çıktı dahil dosyalardır. İşletim sistemi, tanımlayıcıları kullanarak dosyaları tanımlar.

Her işlemin dokuz adede kadar açık dosya tanımlayıcısına sahip olmasına izin verilir. Bash kabuğu, kimlikleri 0, 1 ve 2 olan ilk üç tanımlayıcıyı saklı tutar.

  • 0, STDIN - standart giriş akışı.
  • 1, STDOUT - standart çıktı akışı.
  • 2, STDERR - standart hata akışı.
Bu üç özel tanımlayıcı, komut dosyası giriş ve çıkışını işler.
Standart akışları iyi anlamanız gerekir. Senaryoların dış dünyayla etkileşiminin üzerine inşa edildiği temele benzetilebilirler. Onlarla ilgili detayları ele alalım.

STDIN

STDIN, kabuk için standart girdidir. Bir terminal için standart giriş klavyedir. Komut dosyaları giriş yönlendirme karakterini kullandığında -< , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

Birçok bash komutu, veri almak için komut satırında bir dosya belirtilmedikçe STDIN'den girdi kabul eder. Örneğin, bu cat komutu için geçerlidir.

Komut satırına parametre belirtmeden cat girdiğinizde, STDIN'den girdi kabul eder. Başka bir satır yazdıktan sonra, cat bunu ekrana yazdırır.

STDOUT

STDOUT, kabuğun standart çıktısıdır. Varsayılan olarak, bu ekrandır. Çoğu bash komutu, verileri STDOUT'a verir ve bu da konsolda görünmesine neden olur. Veriler, >> komutu kullanılarak içeriğine eklenerek bir dosyaya yönlendirilebilir.

Yani, bu komutu kullanarak başka veriler ekleyebileceğimiz belirli bir veri dosyamız var:

Şifre >> dosyam
Hangi pwd baskıları, içinde herhangi bir veri mevcut olmadan dosyama eklenecektir.

Komut çıktısını bir dosyaya yönlendirme

Buraya kadar çok iyi, ama ya var olmayan bir xfile'a erişerek aşağıda gösterilene benzer bir şey yapmaya çalışırsanız, tüm bunları myfile'a bir hata mesajı almak için niyet ederseniz.

Ls –l xfile> dosyam
Bu komutu yürüttükten sonra ekranda hata mesajlarını göreceğiz.


Var olmayan bir dosyaya erişmeye çalışmak

Var olmayan bir dosyaya erişmeye çalışmak bir hata üretir, ancak kabuk, hata mesajlarını görüntüleyerek dosyaya yönlendirmedi. Ama hata mesajlarının dosyaya gitmesini istedik. Ne yapalım? Cevap basit - üçüncü standart tanımlayıcıyı kullanın.

STDER

STDERR, kabuğun standart hata akışıdır. Varsayılan olarak, bu tanımlayıcı STDOUT noktaları ile aynı şeye işaret eder, bu yüzden bir hata oluştuğunda ekranda bir mesaj görürüz.

Bu nedenle, hata mesajlarını ekranda görüntülemek yerine örneğin bir günlük dosyasına veya başka bir yere yönlendirmek istediğinizi varsayalım.

▍Yönlendirme hatası akışı

Bildiğiniz gibi dosya tanıtıcısı STDERR 2'dir. Bu tanımlayıcıyı yeniden yönlendirme komutunun önüne yerleştirerek hataları yeniden yönlendirebiliriz:

Ls -l xfile 2> dosyam kedi ./dosyam
Hata mesajı şimdi dosyama gidecek.


Bir hata mesajını bir dosyaya yönlendirme

▍Yönlendirme hatası ve çıkış akışları

Komut satırı komut dosyaları yazarken, hem hata mesajı yeniden yönlendirmesi hem de standart çıktı yeniden yönlendirmesi için düzenleme yapmanız gereken bir durum ortaya çıkabilir. Bunu başarmak için, hataların ve standart çıktının gitmesi gereken dosyaları belirten ilgili tanımlayıcılar için yeniden yönlendirme komutlarını kullanmanız gerekir:

Ls –l myfile xfile otherfile 2> errorcontent 1> rightcontent

Yönlendirme hataları ve stdout

Kabuk, ls komutunun normalde STDOUT'a göndereceği şeyi 1> yapısı sayesinde doğru içerik dosyasına yönlendirecektir. STDERR'de sona erecek olan hata mesajları, 2> yeniden yönlendirme komutu nedeniyle errorcontent dosyasında sona erer.

Gerekirse, hem STDERR hem de STDOUT, &> komutu kullanılarak aynı dosyaya yeniden yönlendirilebilir:


STDERR ve STDOUT'u aynı dosyaya yönlendirme

Komutu yürüttükten sonra, dosya içeriğinde STDERR ve STDOUT için amaçlanan görünür.

Komut dosyalarında çıktıyı yeniden yönlendirme

Komut satırı komut dosyalarında çıktıyı yeniden yönlendirmenin iki yöntemi vardır:
  • Geçici yeniden yönlendirme veya bir satırın çıktısının yeniden yönlendirilmesi.
  • Komut dosyasındaki çıktının tamamını veya bir kısmını kalıcı olarak yeniden yönlendirme veya yeniden yönlendirme.

▍Geçici olarak çıktıyı yeniden yönlendirme

Bir komut dosyasında, tek bir satırın çıktısını STDERR'ye yönlendirebilirsiniz. Bunu yapmak için, STDERR tanımlayıcısını belirterek yeniden yönlendirme komutunu kullanmak yeterlidir ve tanımlayıcı numarasının önüne ve işareti karakteri (&) yerleştirilmelidir:

#! / bin / bash echo "Bu bir hatadır"> & 2 echo "Bu normal çıktıdır"
Komut dosyasını çalıştırırsanız, zaten bildiğiniz gibi, varsayılan olarak hatalar normal verilerle aynı yerde görüntülendiğinden, her iki satır da ekrana gider.


Geçici yönlendirme

STDERR çıktısının dosyaya gitmesi için scripti çalıştıralım.

./myscript 2> dosyam
Gördüğünüz gibi artık konsola olağan çıktı yapılıyor ve dosyaya hata mesajları gönderiliyor.


Hata mesajları bir dosyaya yazılır

▍Kalıcı çıktı yönlendirmesi

Bir betiğin ekrana çok sayıda çıktı yönlendirmesi gerekiyorsa, her yankı çağrısına uygun komutu eklemek elverişsizdir. Bunun yerine, exec komutunu kullanarak çıktının betiğin süresi boyunca belirli bir tanımlayıcıya yönlendirilecek şekilde ayarlayabilirsiniz:

#! / bin / bash exec 1> outfile echo "Bu, tüm çıktıları" echo "bir kabuk komut dosyasından başka bir dosyaya yeniden yönlendirme testidir." echo "her satırı yeniden yönlendirmek zorunda kalmadan"
Senaryoyu çalıştıralım.


Tüm çıktıları bir dosyaya yönlendirme

Çıktı yeniden yönlendirme komutunda belirtilen dosyaya bakarsanız, yankı komutlarının çıktısı olan her şeyin bu dosyada bittiği ortaya çıkıyor.

exec komutu yalnızca betiğin başında değil, başka yerlerde de kullanılabilir:

#! / bin / bash exec 2> myerror echo "Bu, betiğin başlangıcı" echo "şimdi tüm çıktıları başka bir konuma yönlendiriyor" exec 1> myfile echo "Bu, dosyam dosyasına gitmeli" echo "ve bu gitmeli myerror dosyasına "> & 2
Komut dosyasını çalıştırdıktan ve çıktıyı yeniden yönlendirdiğimiz dosyaları görüntüledikten sonra olan budur.


Çıktıyı farklı dosyalara yönlendirme

exec komutu ilk olarak çıktıyı STDERR'den myerror.dll dosyasına yönlendirir. Daha sonra birkaç eko komutunun çıktısı STDOUT'a gönderilir ve ekrana yazdırılır. Bundan sonra, exec komutu, STDOUT'a gidenleri myfile'a göndermeyi kurar ve son olarak, echo komutunda, ilgili satırın myerror'a yazılmasına neden olan STDERR'ye yönlendirme komutunu kullanırız.

Bunda ustalaştıktan sonra, çıktıyı gitmesini istediğiniz yere yönlendirebilmelisiniz. Şimdi girdi yeniden yönlendirme hakkında konuşalım.

Komut dosyalarındaki girişi yeniden yönlendirme

Girdiyi yeniden yönlendirmek için, çıktıyı yeniden yönlendirmek için kullandığımız tekniğin aynısını kullanabilirsiniz. Örneğin, exec komutu STDIN için bir dosya kaynağı oluşturmanıza izin verir:

Yürütme 0< myfile
Bu komut, kabuğa, girişi normal STDIN'den değil, myfile'den kaynaklamasını söyler. Giriş yönlendirmesini çalışırken inceleyelim:

#! / bin / bash yürütme 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
Komut dosyasını çalıştırdıktan sonra ekranda görünecek olan budur.


Yönlendirme girişi

Önceki makalelerden birinde, klavyeden kullanıcı girdisini okumak için read komutunun nasıl kullanılacağını öğrendiniz. Girişi yeniden yönlendirerek veri kaynağını bir dosya haline getirirseniz, STDIN'den veri okumaya çalışırken read komutu onu klavyeden değil dosyadan okuyacaktır.

Bazı Linux yöneticileri, günlük dosyalarını okumak ve ardından işlemek için bu yaklaşımı kullanır.

Kendi çıktı yönlendirmenizi oluşturma

Komut dosyalarında girdi ve çıktıyı yeniden yönlendirirken, üç standart dosya tanımlayıcıyla sınırlı değilsiniz. Belirtildiği gibi, dokuz adede kadar açık tanımlayıcınız olabilir. 3'ten 8'e kadar numaralandırılmış diğer altısı, girdi veya çıktıyı yeniden yönlendirmek için kullanılabilir. Bunlardan herhangi biri bir dosyaya atanabilir ve komut dosyası kodunda kullanılabilir.

exec komutunu kullanarak veri çıkışı için bir tanımlayıcı atayabilirsiniz:

#! / bin / bash exec 3> dosyam echo "Bu, ekranda görüntülenmeli" echo "ve bu dosyada saklanmalı"> & 3 echo "Ve bu ekrana geri dönmeli"
Komut dosyasını çalıştırdıktan sonra, çıktıların bir kısmı ekrana, bir kısmı da tanımlayıcı 3 ile dosyaya gidecektir.


Özel bir tanımlayıcı kullanarak çıktıyı yeniden yönlendirme

Veri girişi için dosya tanımlayıcıları oluşturma

Bir komut dosyasındaki girdiyi çıktıyla aynı şekilde yeniden yönlendirebilirsiniz. Girişi yeniden yönlendirmeden önce STDIN'i farklı bir tanımlayıcıda saklayın.

Dosyayı okumayı bitirdikten sonra STDIN'i geri yükleyebilir ve her zamanki gibi kullanabilirsiniz:

#! / bin / bash yürütme 6<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
Senaryoyu test edelim.


Yönlendirme girişi

Bu örnekte, bir STDIN referansını depolamak için dosya tanımlayıcı 6 kullanıldı. Ardından giriş yönlendirmesi yapıldı, dosya STDIN için veri kaynağı oldu. Bundan sonra, read komutunun girişi, yeniden yönlendirilen STDIN'den, yani dosyadan geldi.

Dosyayı okuduktan sonra, tanımlayıcı 6'ya yeniden yönlendirerek STDIN'i orijinal durumuna döndürüyoruz. Şimdi, her şeyin doğru çalıştığını kontrol etmek için komut dosyası kullanıcıya bir soru sorar, klavye girişini bekler ve girilenleri işler.

Dosya tanımlayıcılarını kapatma

Komut dosyası tamamlandıktan sonra kabuk, dosya tanımlayıcılarını otomatik olarak kapatır. Ancak bazı durumlarda, betik işini bitirmeden önce tanımlayıcıları manuel olarak kapatmak gerekir. Tutamacı kapatmak için & -'ye yönlendirilmesi gerekir. Şuna benziyor:

#! / bin / bash exec 3> dosyam echo "Bu bir veri test satırıdır"> & 3 exec 3> & - echo "Bu çalışmaz"> & 3
Komut dosyasını çalıştırdıktan sonra bir hata mesajı alacağız.


Özel bir dosya tanıtıcısına erişmeye çalışın

Mesele şu ki, var olmayan bir tanımlayıcıya erişmeye çalıştık.

Komut dosyalarındaki dosya tanımlayıcıları kapatırken dikkatli olun. Bir dosyaya veri gönderdiyseniz, ardından tutamacı kapatıp yeniden açtıysanız, kabuk mevcut dosyanın üzerine yenisini yazar. Yani, bu dosyaya daha önce yazılan her şey kaybolacak.

Açık tanımlayıcılar hakkında bilgi alma

Linux'ta açık olan tüm tanıtıcıların bir listesini almak için lsof komutunu kullanabilirsiniz. Fedora gibi birçok dağıtımda, lsof yardımcı programı / usr / sbin dizininde bulunur. Bu komut, sistemde açık olan her bir tanıtıcı hakkında bilgi gösterdiği için çok kullanışlıdır. Bu, arka planda çalışan işlemler tarafından açılanları ve oturum açmış kullanıcılar tarafından açılanları içerir.

Bu komutun birçok anahtarı var, en önemlilerine bakalım.

  • -p İşlem kimliğini belirlemenizi sağlar.
  • -d Hakkında bilgi almak istediğiniz tanımlayıcının numarasını belirlemenizi sağlar.
Mevcut sürecin PID'sini bulmak için, kabuğun mevcut PID'yi yazdığı özel ortam değişkeni $$'ı kullanabilirsiniz.

-a anahtarı, diğer iki anahtar kullanılarak döndürülen sonuçlar üzerinde mantıksal bir AND işlemi gerçekleştirmek için kullanılır:

Lsof -a -p $$ -d 0,1,2

Açık tanımlayıcılar hakkında bilgi görüntüleme

STDIN, STDOUT ve STDERR ile ilişkili dosyaların türü CHR'dir (karakter modu). Hepsi bir terminale işaret ettiğinden, dosya adı terminale atanan cihaz adıyla eşleşir. Her üç standart dosya da okuma ve yazma için kullanılabilir.

Standarta ek olarak, diğer tanımlayıcıların açık olduğu komut dosyasından lsof komutuna yapılan çağrıya bakalım:

#! / bin / bash yürütme 3> dosyam1 yürütme 6> dosyam2 yürütme 7< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
Bu betiği çalıştırırsanız olacağı budur.


Komut dosyası tarafından açılan dosya tanımlayıcılarını görüntüleme

Komut dosyası, çıktı (3 ve 6) için iki ve girdi (7) için bir tanımlayıcı açtı. Tanımlayıcıları yapılandırmak için kullanılan dosyaların yolları da burada gösterilir.

Çıkış bastırma

Bazen, örneğin bir arka plan işlemi olarak yürütülebilen komut dosyasındaki komutların ekranda hiçbir şey göstermediğinden emin olmanız gerekir. Bunu yapmak için çıktıyı / dev / null'a yönlendirebilirsiniz. Bu "kara delik" gibi bir şey.

Örneğin, hata mesajlarının çıktısının nasıl bastırılacağı aşağıda açıklanmıştır:

Ls -al badfile başka bir dosya 2> / dev / null
Aynı yaklaşım, örneğin bir dosyayı silmeden temizlemeniz gerektiğinde kullanılır:

Kedi / dev / boş> dosyam

sonuçlar

Bugün, komut satırı komut dosyası oluşturmada girdi ve çıktının nasıl çalıştığını öğrendiniz. Artık dosya tanımlayıcıları nasıl kullanacağınızı, bunları nasıl oluşturacağınızı, görüntüleyeceğinizi ve kapatacağınızı, girdi, çıktı ve hata akışlarını yeniden yönlendirmeyi biliyorsunuz. Bunların hepsi, bash betikleri geliştirme işinde çok önemlidir.

Bir dahaki sefere, Linux sinyalleri, bunların komut dosyalarında nasıl ele alınacağı, zamanlanmış işleri çalıştırma ve arka plan görevleri hakkında konuşacağız.

Sevgili okuyucular! Bu makale giriş, çıkış ve hata akışlarıyla çalışmanın temellerini kapsar. Eminiz ki tüm bunları ancak tecrübe ile anlatabilecek profesyoneller vardır aranızda. Eğer öyleyse, size söz veriyoruz.

Çoğu zaman, terminalde çalışırken, komutların çalışmasının (veya herhangi bir konsol uygulamasının) sonucunu bir metin dosyasına veya daha basit bir şekilde bir günlüğe kaydetmek gerekir. Linux'ta bu fikri uygulamanın birçok yolu vardır ve bu yazıda bunlardan bazılarına bakacağız.

Standart çıkış akışı ( Standart Çıkış) - Hatalar dışında, komut yürütmenin bir sonucu olarak görüntülenen tüm bilgiler bunlardır.
Standart hata çıkış akışı ( StdErr) - Bu, varsa hatayla ilgili bilgilerdir.


komut> logfile.txt

Standart çıktı akışı (StdOut) bir dosyaya yönlendirilecek ve terminalde görüntülenmeyecektir. Dosya zaten mevcutsa, o zaman üzerine yazılmış.

Komut >> logfile.txt

Standart çıktı akışı (StdOut) bir dosyaya yönlendirilecek ve terminalde görüntülenmeyecektir. Dosya zaten mevcutsa, yeni veriler dosyanın sonuna eklendi.

Komut 2> logfile.txt

Standart hata çıktı akışı (StdErr) bir dosyaya yönlendirilecek ve terminalde görüntülenmeyecektir. Dosya zaten mevcutsa, üzerine yazılmış.

Komut 2 >> logfile.txt

Standart hata çıktı akışı (StdErr) bir dosyaya yönlendirilecek ve terminalde görüntülenmeyecektir. Dosya zaten mevcutsa, yeni veriler dosyanın sonuna eklendi.

&> Logfile.txt komutu

Standart çıktı akışı (StdOut) ve hatalar için standart çıktı akışı (StdErr) bir dosyaya yönlendirilecek ve terminalde görüntülenmeyecektir. Dosya zaten mevcutsa, o zaman üzerine yazılmış.

& >> logfile.txt komutu

Standart çıktı akışı (StdOut) ve hatalar için standart çıktı akışı (StdErr) bir dosyaya yönlendirilecek ve terminalde görüntülenmeyecektir. Dosya zaten mevcutsa, yeni veriler dosyanın sonuna eklendi.

Takım | tee logfile.txt

Standart veri çıkış akışı (StdOut) bir dosyaya yönlendirilecek ve aynı anda terminalde görüntülenecektir. Dosya zaten mevcutsa, üzerine yazılmış.

Takım | tee -a logfile.txt

Standart veri çıkış akışı (StdOut) bir dosyaya yönlendirilecek ve aynı anda terminalde görüntülenecektir. Dosya zaten mevcutsa, yeni veriler dosyanın sonuna eklendi.

Örnekleri

uname -r> logfile.txt

Çıktı, geçerli dizinde logfile.txt dosyasına kaydedilecektir. Ekranda hiçbir şey görüntülenmeyecek.

Uname -r | tee logfile.txt

Çıktı, geçerli dizinde logfile.txt dosyasına kaydedilecektir. Ve ayrıca sonuç ekranda görüntülenecektir.



G / Ç aygıtlarını yeniden atayarak, bir program çıktısını diğerinin girdisine yönlendirebilir veya girdi olarak kullanarak başka bir programın çıktısını kesebilir. Böylece, minimum program yükü ile süreçten sürece bilgi aktarmak mümkündür. Pratikte bu, standart giriş ve çıkış aygıtlarını kullanan programlar için işletim sisteminin aşağıdakilere izin verdiği anlamına gelir:

  • program mesajlarını ekrana (standart çıktı akışı) değil, bir dosyaya veya yazıcıya (çıktı yeniden yönlendirmesi) gönderir;
  • giriş verilerini klavyeden (standart giriş akışı) değil, hazırlanmış bir dosyadan okuyun (giriş yeniden yönlendirmesi);
  • Bir programın çıktısını başka bir programa girdi olarak iletin (boru hattı veya komut kompozisyonu).

Komut satırından bu yetenekler aşağıdaki gibi uygulanır. Herhangi bir komutla görüntülenen metin mesajlarını komut satırından bir metin dosyasına yönlendirmek için yapıyı kullanmanız gerekir. komut> dosya adı.Çıktı için belirtilen dosya zaten mevcutsa, üzerine yazılır (eski içerik kaybolur), yoksa oluşturulur. Dosyayı yeniden oluşturmak değil, komutla çıkan bilgi çıktısını mevcut dosyanın sonuna eklemek de mümkündür. Bunu yapmak için çıktı yeniden yönlendirme komutu şu şekilde belirtilmelidir: komut >> dosya adı... Sembolü kullanma< можно прочитать входные данные для заданной команды не с клавиатуры, а из определенного (заранее подготовленного) файла: команда < имя_файла

Komut satırı giriş/çıkış yönlendirme örnekleri

İşte bazı G/Ç yönlendirme örnekleri.

1. Sonuçların sonucu ping komutları dosyalamak ping ya.ru> ping.txt

2. için yardım metni ekleme XCOPY komutları.txt dosyasını kopyalamak için: XCOPY /? >> kopyala.txt

Gerekirse, 2> dosya adı komutu kullanılarak hata mesajları (standart hata akışı) bir metin dosyasına yönlendirilebilir. Bu durumda, standart çıktı ekrana yazdırılacaktır. Aynı dosyaya bilgi ve hata mesajlarının çıktısını almak da mümkündür. Bu şu şekilde yapılır: komut> dosya adı 2> & 1

Örneğin, aşağıdaki komut, standart çıktıyı ve standart hatayı copy.txt dosyasına yönlendirir: XCOPY A: \ 1.txt C:> kopya.txt 2> & 1

Linux'un yerleşik yeniden yönlendirme yetenekleri, size her türlü görev için çok çeşitli kullanılmış basitleştirme araçları sağlar. Farklı G/Ç akışlarını yönetme yeteneği, hem karmaşık yazılımlar geliştirirken hem de komut satırını kullanarak dosyaları yönetirken üretkenliği önemli ölçüde artıracaktır.

G / Ç akışları

Linux ortamında giriş ve çıkış üç iş parçacığı arasında bölünür:

  • Standart giriş (standart giriş, stdin, akış numarası 0)
  • Standart çıktı (stdout, sayı 1)
  • Standart hata veya tanı akışı (standart hata, stderr, sayı 2)

Kullanıcı terminal ile etkileşime girdiğinde, kullanıcının klavyesinden standart girdi geçirilir. Standart çıktı ve standart hata, kullanıcı terminalinde metin olarak görüntülenir. Bu akışların üçüne de standart akışlar denir.

Standart giriş

Standart girdi akışı genellikle verileri kullanıcıdan programa aktarır. Standart girdi kabul eden programlar genellikle bir aygıttan (klavye gibi) girdi alır. Standart girdi, EOF'ye (dosya sonu) ulaştığında durur. EOF, okunacak daha fazla veri olmadığını gösterir.

Standart girdinin nasıl çalıştığını görmek için cat komutunu çalıştırın. Bu aracın adı "birleştirmek" (bir şeyi bağlamak veya birleştirmek için) anlamına gelir. Genellikle bu araç, iki dosyanın içeriğini birleştirmek için kullanılır. Bağımsız değişken olmadan çalıştırıldığında, cat bir komut satırı açar ve standart girdinin içeriğini kabul eder.

Şimdi bazı sayılar girin:

1
2
3
ctrl-d

Bir sayı yazıp enter tuşuna basarak, bu verileri kabul eden çalışan kedi programına standart girdi gönderirsiniz. Sırayla, cat programı alınan girdiyi standart çıktı üzerinde görüntüler.

Kullanıcı ctrl-d tuşlarına basarak EOF'yi ayarlayabilir, ardından cat programı duracaktır.

Standart çıktı

Standart çıktı, program tarafından oluşturulan verileri yazar. Standart çıktı yeniden yönlendirilmediyse, metni terminale yazdıracaktır. Örnek olarak aşağıdaki komutu çalıştırmayı deneyin:

echo Standart çıkış yoluyla terminale gönderilir

echo komutu, ek seçenekler olmadan, komut satırında kendisine iletilen tüm argümanları ekranda görüntüler.

Şimdi echo'yu argüman olmadan çalıştırın:

Komut boş bir dize döndürür.

Standart hata

Bu standart akış, çöken program tarafından oluşturulan hataları kaydeder. Standart çıktı gibi, bu akış da verileri terminale gönderir.

ls komutu için bir hata akışı örneğine bakalım. ls komutu, dizinlerin içeriğini görüntüler.

Argüman olmadan bu komut, geçerli dizinin içeriğini döndürür. ls argümanı olarak bir dizin adı belirtirseniz, komut içeriğini döndürür.

% dizini mevcut olmadığından, komut standart hata döndürür:

ls: %'ye erişilemiyor: Böyle bir dosya veya dizin yok

Akış yönlendirmesi

Linux, her akışı yeniden yönlendirmek için özel komutlar sağlar. Bu komutlar bir dosyaya standart çıktı yazar. Çıktı var olmayan bir dosyaya yönlendirilirse, komut bu ada sahip yeni bir dosya oluşturacak ve yönlendirilen çıktıyı bu dosyaya kaydedecektir.

Tek açılı ayraçlı komutlar, hedef dosyanın mevcut içeriğinin üzerine yazar:

  • > - standart çıktı
  • < — стандартный ввод
  • 2> - standart hata

Çift açılı ayraçlı komutlar, hedef dosyanın içeriğinin üzerine yazmaz:

  • >> - standart çıktı
  • << — стандартный ввод
  • 2 >> - standart hata

Aşağıdaki örneği göz önünde bulundurun:

kedi> write_to_me.txt
a
B
C
ctrl-d

Bu örnekte, çıktıyı bir dosyaya yazmak için cat komutu kullanılmıştır.

write_to_me.txt içeriğini inceleyin:

kedi write_to_me.txt

Komut dönmelidir:

Kediyi yeniden write_to_me.txt dosyasına yönlendirin ve üç basamak girin.

kedi> write_to_me.txt
1
2
3
ctrl-d

Şimdi dosyanın içeriğini kontrol edin.

kedi write_to_me.txt

Komut dönmelidir:

Gördüğünüz gibi, çıktıyı yeniden yönlendiren komut tek açılı ayraç kullandığından dosya yalnızca en son çıktıyı içerir.

Şimdi aynı komutu iki açılı ayraçla çalıştırmayı deneyin:

kedi >> write_to_me.txt
a
B
C
ctrl-d

write_to_me.txt dosyasını açın:

1
2
3
a
B
C

Çift açılı ayraçlı komutlar, mevcut içeriğin üzerine yazmaz, ancak onu güçlendirir.

Konveyörler

Borular, bir komutun çıktısını diğerinin girdisine yönlendirir. Bu durumda ikinci programa aktarılan veriler terminalde görüntülenmez. Veriler sadece ikinci program tarafından işlendikten sonra ekranda görünecektir.

Linux'ta boru hatları dikey bir çubukla temsil edilir.

Örneğin:

Bu, ls çıktısını (geçerli dizinin içeriği) daha azına yönlendirir ve bu, kendisine satır satır iletilen verileri görüntüler. Kural olarak, ls dizinlerin içeriğini satırlara bölünmeden arka arkaya yazdırır. ls çıktısını daha azına yönlendirirseniz, son komut çıktıyı satırlara böler.

Gördüğünüz gibi, bir işlem hattı, verileri yalnızca dosyalara yönlendiren> ve >> aksine, bir komutun çıktısını diğerinin girişine yönlendirebilir.

Filtreler

Filtreler, ardışık düzenin yeniden yönlendirmesini ve çıktısını değiştirebilen komutlardır.

Not: Filtreler ayrıca bir işlem hattı olmadan kullanılabilen standart Linux komutlarıdır.

  • bul - Bir dosyayı ada göre arar.
  • grep - Belirli bir desene göre metin arar.
  • tee - Standart girdiyi standart çıktıya ve bir veya daha fazla dosyaya yönlendirir.
  • tr - dizeleri arayın ve değiştirin.
  • wc - karakterleri, satırları ve kelimeleri sayar.

G/Ç yönlendirme örnekleri

Artık yeniden yönlendirmenin temel kavramlarına ve mekanizmalarına aşina olduğunuza göre, bunların kullanımına ilişkin bazı temel örneklere bakalım.

komut> dosya

Bu kalıp, komutun standart çıktısını bir dosyaya yönlendirir.

ls ~> root_dir_contents.txt

Bu komut, sistem kök dizininin içeriğini standart çıktı olarak aktarır ve çıktıyı root_dir_contents dosyasına yazar. Komut tek açılı ayraç kullandığından bu, dosyadaki önceki tüm içeriği kaldıracaktır.

komut> / dev / boş

/ dev / null, konsola istenmeyen çıktıları önlemek için standart çıktıyı veya tanılamayı bastırmak için kullanılan özel bir dosyadır ("boş aygıt" olarak adlandırılır). / dev / null içine düşen tüm veriler atılır. / dev / null'a yönlendirme, kabuk betiklerinde yaygın olarak kullanılır.

ls> / dev / boş

Böyle bir komut, ls komutu tarafından döndürülen standart çıktıyı, / dev / null'a ileterek temizler.

komut 2> dosya

Bu şablon, komutun standart hatasını mevcut içeriğinin üzerine yazarak bir dosyaya yönlendirir.

mkdir "" 2> mkdir_log.txt

Bu komut, geçersiz bir dizin adından kaynaklanan hatayı yeniden yönlendirecek ve bunu log.txt dosyasına yazacaktır. Lütfen, hatanın hala terminalde görüntülendiğini unutmayın.

komut >> dosya

Bu kalıp, bir komutun standart çıktısını dosyanın mevcut içeriğinin üzerine yazmadan bir dosyaya yönlendirir.

echo Yeni bir dosyaya yazıldı> data.txt
echo Mevcut bir dosyanın içeriğine eklendi >> data.txt

Bu komut çifti, önce kullanıcı girdisini yeni bir dosyaya yönlendirir ve ardından içeriğinin üzerine yazmadan mevcut dosyaya ekler.

komut 2 >> dosya

Bu şablon, mevcut dosya içeriğinin üzerine yazmadan komut standart hatasını bir dosyaya yönlendirir. Günlüğün içeriği sürekli güncellenmeyeceğinden, bir program veya hizmetin hata günlüklerini oluşturmak için uygundur.

"" 2> stderr_log.txt dosyasını bulun
wc "" 2 >> stderr_log.txt

Yukarıdaki komut, geçersiz bulma bağımsız değişkeninin neden olduğu hata mesajını stderr_log.txt dosyasına yönlendirir ve ardından geçersiz wc bağımsız değişkeninin neden olduğu hata mesajını ona ekler.

takım | emretmek

Bu model, ilk komutun standart çıktısını ikinci komutun standart girdisine yönlendirir.

bul / var lib | grep borç

Bu komut / var dizinini ve alt dizinlerini dosya adları ve deb uzantıları için arar ve arama modelini kırmızıyla vurgulayarak dosya yollarını döndürür.

takım | tee dosyası

Böyle bir kalıp, komutun standart çıktısını bir dosyaya yeniden yönlendirir ve içeriğinin üzerine yazar ve ardından yeniden yönlendirilen çıktıyı terminalde görüntüler. Belirtilen dosya yoksa yeni bir dosya oluşturur.

Bu şablonda, tee komutu genellikle bir programın çıktısını görüntülemek ve aynı anda bir dosyaya kaydetmek için kullanılır.

wc / vb / büyü | tee magic_count.txt

Böyle bir komut, sihirli dosyadaki (Linux, dosya türlerini belirlemek için bunu kullanır) karakter, satır ve sözcük sayısını, bu verileri terminale ve magic_count.txt dosyasına gönderen tee komutuna iletir.

takım | takım | komut >> dosya

Bu kalıp, ilk komutun standart çıktısını yeniden yönlendirir ve sonraki iki komut arasında filtreler, ardından son çıktıyı bir dosyaya ekler.

ls ~ | grep * katran | tr e E >> ls_log.txt

Böyle bir komut, kök dizinin ls çıktısını grep komutuna gönderir. Buna karşılık grep, alınan verilerde tar dosyalarını arar. Bundan sonra, grep sonucu, tüm e karakterlerini bir E ile değiştirecek olan tr komutuna iletilir. Ortaya çıkan sonuç, ls_log.txt dosyasına eklenecektir (eğer böyle bir dosya yoksa, komut otomatik olarak oluşturacaktır). ).

Çözüm

Linux G/Ç yeniden yönlendirme işlevleri ilk başta çok karmaşık görünüyor. Ancak, yeniden yönlendirme ile çalışmak bir sistem yöneticisinin en önemli becerilerinden biridir.

Bir komut hakkında daha fazla bilgi edinmek için şunu kullanın:

adam komutu | az

Örneğin:

Böyle bir komut, tee için tam bir komut listesi döndürür.

Etiketler:
Fok
Konunun devamı:
elma

Ne eksik ne fazla - dünyanın en gelişmiş darbeye dayanıklı akıllı telefonu. Xiaomi'nin geniş pilli akıllı telefonları modaya uygun hale getirmesi gibi, Motorola da ilk ...