Yanıtlar:
Bu durumda her iki yönlendirme yöntemi (> ve >>) arasında kavramanız gereken temel şey:
Yönlendirildiği bilgileri yönlendirir ve üzerine yazar . Bu, "|" borusundan herhangi bir bilgi alınırken olur
Yönlendirildiği bilgileri yönlendirir ve birleştirir . Bu, "|" borusundan herhangi bir bilgi alınırken olur
Her iki durumda da dosya yoksa, dosya oluşturulur. Aynı dosya üzerinde tekrar çalıştırırsanız, bilgiler yalnızca ">>" üzerinde birleştirilir. ">" İle ilk çalıştırmada yaptığınız her şeyin üzerine yazabilirsiniz.
Ancak çıktı dosyasıyla aynı girdi dosyasını kullanırken yapılan anlaşma. Bu durumda, ">" kullanırsanız, çıktı dosyasının "üzerine yazacağı" için "giriş" kısmının ayrıştırılması gereken bilgileri kaldırırsınız. Yani:
rev file.txt | cat > file.txt
"Ağır çekim açıklaması" nda gerçekte olan şey:
rev
içeriğini tersine çevirmeye file.txt
ve boruya göndermeye hazırlarrev
boruya bilgi gönderdiğinden, boru doğrudan akışları cat
.cat
bilgilerini alıyorsa otomatik olarak uygulayacaktır file.txt
onunla kuruldu.cat
rev
tüm dosyanın oluşturulmasını beklemez . Bilgilerin ilk kısmının kendisine ulaştığı andan itibaren başlayacak, yani kullandığınız sembole bağlı olarak bir bağlantı açılacaktır file.txt
.file.txt
file.txt
file.txt
olan > , rev
's işi yapmak ve çünkü hiçbir şey elde etmeye çalışacağını cat
yeni bilgiler için hazırlık silinen herşey.Peki diğerleri yukarıdakileri okuduktan sonra neden çalışıyor? Bu nedenle:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
Burada, bilgiyi başka bir dosyaya gönderen kediye pipetleme yapıyorsunuz . Bu durumda, işlenen girdi dosyası file.txt
çıktı dosyası ile aynı değildir file2.txt
. Kelimenin tam anlamıyla bütün üzerine yazıyorsunuz Bundan sonra file2.txt
birlikte file.txt
yapılan tüm süreç böylece, cat
silindi. Temelde tüm satır basitleştirilebilir cp file.txt file2.txt
çünkü aynı şeyi yapıyor çünkü file2.txt
sonunda kaybediyor rev
ve mv
komutla üzerine yazılıyor .
rev file.txt | cat >> file.txt
Bu durumda , bilgileri aynı dosyayla birleştirirsiniz . Bu yüzden sadece o dosyaya bir bağlantı açıyor, ancak tek bir > ile görüldüğü gibi bilgileri silmiyor . Sonuç, orijinal bilgiler artı tersine çevrilmiş bilgiler olmalıdır.
rev file.txt | cat --bogus-option > file.txt
kedi de açmaya çalışmasa da dosyayı kesecektir.
moreutils
içerir) sponge
, özellikle bir giriş dosyası üzerine yazmak USECASE tasarlanmış bir araçtır. Örneğin, rev file.txt >file2.txt && mv file2.txt file.txt
geçici bir çözüm olur ve rev file.txt | sponge file.txt
zaten adlandırılmış bir şey olsa bile düzgün çalışır file2.txt
.
Kabuk yeniden yönlendirme gördüğünde, ilgili komutlardan herhangi birini yürütmeden önce ilgili dosyaları açar. Böylece, yaptığınız zaman:
foo file.txt | bar > file.txt
Daha öncefile.txt
kısaltılmasına neden olan yönlendirme çalıştırılır ve okunabilir . Yan notta, bu yüzden yapamazsınız: foo
file.txt
sed 'blah' file.txt > file.txt
Ve neden sed
yerinde düzenleme seçeneği var?
Son olarak:
.. | cat > file.txt
olan kedinin bir işe yaramaz kullanımı sen okuma denemesinde, özellikle eğer öyleyse, file.txt
daha erken.
Bir dosyayı yerinde ters çevirmek istiyorsanız, kısayol yoktur . Yerinde düzenleme ile sed
veya awk
püf noktalarını kullanabilirsiniz .
>
çıktıyı başka bir şeye gönderen bir yönlendirici (operatör)
(bir sonraki komutun girişi, yazıcı ..)
Sizin durumunuzda çıktı bir dosyaya gider file.txt
, eğer bu dosya zaten mevcutsa, üzerine yazılır, eğer oluşturulmamışsa.
>>
bir ekleme operatörüdür, file.txt
zaten varsa çıktı dosyanın sonuna eklenir. dosya yoksa, oluşturulur ve çıktı >
(yeniden yönlendirici) ile aynı şekilde yeni dosyaya yazılır .
>
ve >>
operatörler.
Vim'i Ex modunda kullanabilirsiniz:
ex -sc '%!rev' -cx file.txt
%
tüm satırları seç
!
komutu çalıştır
x
kaydet ve kapat
cat
bu gibi dışarı:rev file.txt > file2.txt && mv file2.txt file.txt
. Bu gereksiz bir kullanımdırcat
. Dışarıda bırakarak, ekstra bir süreç yumurtlamaya yedek.