'>' İle ilgili uyarı
G / Ç yönlendirmesini ( <ve >) henüz öğrenmiş olan Unix yeni başlayanlar genellikle
Komut ... input_file > the_same_file
veya
command … < dosya > the_same_file
veya, neredeyse eşdeğerde
kedi dosyası | komut …> the_same_file
( grep, sed, cut, sort, Ve spellinsanlar bu gibi yapılara kullanmak için cazip olan komutlar örnekleridir.) Kullanıcılar bu senaryolar boş hale dosyayı neden olduğunu keşfetmek için şaşırırlar.
Diğer cevapta belirtilmemiş gibi görünen bir nüans , bash'ın (1) Yönlendirme bölümünün ilk cümlesinde gizlenmiş olarak bulunabilir :
Bir komut çalıştırılmadan önce, giriş ve çıkış
, kabuk tarafından yorumlanan özel bir gösterim kullanılarak yönlendirilebilir .
İlk beş kelimenin, kalın, italik, altı çizili, büyütülmüş, yanıp sönen, kırmızı renkte
olması ve kabuğun komutun yerine getirilmesinden önce istenen yönlendirmeleri gerçekleştirdiğini vurgulamak için bir simge ile işaretlenmiş olması gerekir
. Ve ayrıca hatırla
Çıktının yeniden yönlendirilmesi, dosyanın… yazmak için açılmasına neden olur…. Dosya yoksa, oluşturulur; eğer varsa, sıfır boyuta kesilir.
Yani, bu örnekte:
sort roster > roster
Kabuk roster, sortprogram çalışmaya başlamadan önce dosyayı yazmak için kısaltır (yani tüm içeriğini atar) . Doğal olarak, verileri kurtarmak için hiçbir şey yapılamaz.
Biri bunu beklemeyebilir
tr "[:upper:]" "[:lower:]" < poem > poem
daha iyi olabilirdi. Kabuk, yönlendirmeleri soldan sağa işlediğinden, yazmak için açmadan önce (standart çıktı için) poemokumak için açılır ( trstandart giriş için). Ama yardımcı olmuyor. Bu işlem sırası iki dosya tanıtıcısı verse de, ikisi de aynı dosyaya işaret eder. Kabuk dosyayı okumak için açtığında, içerik hala oradadır, ancak program yürütülmeden önce yine de engellenir.
Peki bu konuda ne yapmalı?
Çözümler şunları içerir:
Çalıştırdığınız programın, çıktının nereye gideceğini belirtmek için kendi içsel, yetenekli olup olmadığını kontrol edin. Bu genellikle -o(veya --output=) bir belirteçle gösterilir. Özellikle,
sort roster -o roster
kabaca eşittir
sort roster > roster
Ancak, ilk durumda, sortprogram çıktı dosyasını açar. Kadar Ve çıkış dosyasını açmak için yeterli zeki sonra o giriş dosya (lar) tüm okuma.
Benzer şekilde, en azından bazı versiyonları sedbir var -i(edit i geri girdi dosyasına dışarı çıktı yazmak için kullanılabilir n yerleştirmek) seçeneğini (yine sonra tüm giriş okundu). Gibi Editörler ed/ ex, emacs, pico, ve vi/ vim
kullanıcı bir metin dosyasını düzenlemek ve orijinal dosyada düzenlenmiş metni kaydetmek için izin verir. Not ed(en azından) etkileşimsiz kullanılabilir.
viilgili bir özelliği var. Eğer yazarsanız , bu dışarı düzenleme tamponu içeriğini yazacak çıkışını okumak, ve (orijinal içeriğini değiştirme) tampon içine sokun.:%!commandEntercommand
Basit ama etkili:
command … input_file > temp_file && mv temp_file input_file
Bu input_file, bir bağlantı olması durumunda (muhtemelen) ayrı bir dosya ile değiştirileceği dezavantajına sahiptir . Ayrıca, yeni dosya varsayılan koruma ile size aittir. Özellikle, bu, orijinal olmasa bile, dosyanın dünya tarafından okunabilir hale gelme riskini taşır input_file.
Varyasyonlar:
command … input_file > temp_file && cp temp_file input_file && rm temp_file
ki hala (potansiyel olarak) temp_filedünyayı okunabilir kılar. Daha iyi:
cp input_file temp_file && command … temp_file > input_file && rm temp_file
Bunlar, potansiyel olarak iki kat daha fazla G / Ç maliyeti karşılığında dosyanın bağlantı durumunu, sahibini ve modunu (korumasını) korur. (Sen gibi bir seçeneği kullanmak gerekebilir -aveya -pilgili cp
özelliklerini korumak için bunu söylemek için.)
command … input_file > temp_file &&
cp --attributes-only --preserve=all input_file temp_file &&
mv temp_file input_file
(sadece okunabilirlik için ayrı satırlara bölünür) Bu, dosyanın modunu korur (ve eğer siz kökseniz, sahibini), ancak size ait kılar (siz kök değilseniz) ve ayrı bir dosya.
Bu blog
(“yerinde” dosyaların düzenlenmesi) önerir ve açıklar
{rm input_file && command …> input_file ; } < input_file
Bu, commandstandart girdiyi işleyebilmesini gerektirir (ancak neredeyse tüm filtrelerin yapabilmesi gerekir). Blogun kendisi buna riskli bir tortu diyor ve kullanımını engelliyor. Ve bu aynı zamanda size ait ve varsayılan izinlere sahip yeni, ayrı bir dosya (hiçbir şeye bağlı değil) oluşturacaktır.
Moreutils paketi adı verilen bir komut içeriyor sponge:
komut … input_file | the_same_file'ın sünger
Daha fazla bilgi için bu cevaba bakınız .
İşte bana tam bir sürpriz olarak gelen bir şey:
sözdizimi diyor ki :
[Bu çözümlerin çoğu] “salt okunur” sizin demektir salt okunur bir dosya sistemi üzerinde başarısız olur $HOME olur yazılabilir olabilir, ama /tmpolacak salt okunur (varsayılan olarak). Örneğin, Ubuntu'nuz varsa ve Kurtarma Konsolu'nu başlattıysanız, genellikle durum budur. Ayrıca, burada-belge operatörü <<<gerek duyduğu, ya orada çalışmaz /tmpedilecek okuma / yazma
o da orada içine geçici bir dosya yazacağız çünkü.
( bu soru bir strace'd çıktı içeriyorsa bkz. )
Bu durumda aşağıdakiler işe yarayabilir:
Peki, soru neydi?
Bu U&L'de popüler bir konudur; aşağıdaki sorularda ele alınmaktadır:
… Ve bu Süper Kullanıcı veya Ask Ubuntu'ya sayılmaz. Yukarıdaki soruların cevaplarından bu bilgilerin çoğuna bu cevabı dahil ettim, hepsini değil. (Yani, daha fazla bilgi için, yukarıda listelenen soruları ve cevaplarını okuyun.)
PS Yukarıda bahsettiğim blog ile bir bağlantım yok .