'>' İ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 spell
insanlar 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
, sort
program ç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) poem
okumak için açılır ( tr
standart 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, sort
program çı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ı sed
bir 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.
vi
ilgili 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.:%!command
Entercommand
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_file
dü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 -a
veya -p
ilgili 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, command
standart 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 /tmp
olacak 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 /tmp
edilecek 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 .