Yeni bir dosya oluştururken “dokunmatik dosya” ve “> dosya” kullanmanın farkı nedir?


13

Linux'ta yeniyim. Bash kullanarak geçerli dizin altında yeni bir .gitignore dosyası oluşturduğumda, yapabileceğimi öğrendim:

> .gitignore

veya

touch .gitignore

Görünüşe göre aynı şeyi yapıyorlar. Kılavuzu kontrol ettiğimde touch, geçerli dosya için zaman damgasını değiştir diyor, ancak için bir kılavuz yok >. Birisi >bu bağlamda bu iki komutu kullanmanın ne yapabileceğini açıklayabilir mi? Teşekkürler.


1
Amaçlanan kullanımını öğrenmeden '>' dosyasını bir dosya üreticisi olarak kullanmayı öğrendiğinizi merak ediyorum
forresthopkinsa

1
Yeniden yönlendirmeyi Bash kılavuzunda bulabilirsiniz. Komut satırına komutu girin man bash. Bu uzun bir belgedir ve iyi anlaşılması günler hatta haftalar alacaktır, ancak Bash'ı iyice öğrenmek istiyorsanız geçmeye değer.
Paddy Landau

Yanıtlar:


21

>kabuk yeniden yönlendirme operatörüdür. Bkz . Shell komutunda ">" ve ">>" arasındaki fark nedir? ve Ne zaman <veya <() veya << ve> veya> () kullanmalıyım? Öncelikle bir komutun çıktısını bir dosyaya yönlendirmek için kullanılır. Dosya yoksa, kabuk dosyayı oluşturur. Varsa, kabuk onu keser (boşaltır). Sadece bir > filekomut yoktur, bu nedenle kabuk bir dosya oluşturur, ancak çıktı gönderilmez, bu nedenle net etki boş bir dosya oluşturmak veya mevcut bir dosyayı boşaltmaktır.

touchzaten bildiğiniz gibi bir dosya oluşturan veya zaman damgasını güncelleyen harici bir komuttur. İle touch, dosya içeriği, aksine, kaybolmaz >.

Davranışı >kabuğa bağlıdır. Bash, çizgi ve çoğu mermi > foobeklediğiniz gibi çalışacaktır. Zsh'de, varsayılan olarak, - > foogibi çalışır cat > foozsh girdiyi yazmanızı bekler.


10
Buradaki kilit nokta, arasında pratik bir fark olmamasıdır >> fileve touch fileeğer filemevcut değilse, ikisi ile > file(önceki içeriğinin filekaybolması) arasında büyük bir fark vardır. Bu, artı zsh araçlarının tutarsız davranışı touch file"en güvenli" dir ve bu nedenle Bunu Yapmanın Doğru Yolu olarak ezberlenmelidir.
Monty Harder

1

İşte ilginç bir karşılaştırma:

$ cat redirect.sh touch.sh sed.sh awk.sh cp.sh truncate.sh tee.sh vi.sh
> redirect.txt
touch touch.txt
sed 'w sed.txt' /dev/null
awk 'BEGIN {printf > "awk.txt"}'
cp /dev/null cp.txt
truncate -s0 truncate.txt
tee tee.txt </dev/null
vi -esc 'wq vi.txt'

Sonuç:

$ strace dash redirect.sh | wc -l
387

$ strace dash touch.sh | wc -l
667

$ strace dash sed.sh | wc -l
698

$ strace dash awk.sh | wc -l
714

$ strace dash cp.sh | wc -l
786

$ strace dash truncate.sh | wc -l
1004

$ strace dash tee.sh | wc -l
1103

$ strace dash vi.sh | wc -l
1472

1
Karşılaştırma ilginç olsa da, burada görmemi istediğiniz şeyi gerçekten görmüyorum. Ne istediğini açıklayabilir misin? Sanırım dosyalara bir şeyler yazmanın farklı yolları var, ama bunun gibi biraz kafa karıştırıcı buluyorum. Benim kahve eksikliği olsa olabilir.
08:00 08

@ m00am Burada gösterilen, etkili bir şekilde dosya oluşturmanın 8 farklı yoludur. straceyürütülmekte olan sistem çağrılarını göstermesi gerekiyor ve > file.txtyöntemin en az sistem çağrıları olduğu gösteriliyor, ki bu gerçekten de şaşırtıcı değil - bir araç ne kadar karmaşıksa, sistem çağrıları o kadar karmaşık. Ancak gösterilen örneklerle ilgili sorun, varsayılan straceolarak stderrakışa yazması ve bu cevapta Steven'ın sadece okumak için boru kullanması stderr, bu yüzden |boru kullanarak satırları sayma şeklini biraz karıştırıyorum|&
Sergiy Kolodyazhnyy

Ve Ubuntu |&16.04'te, @Serg'den bahsedildiği gibi, buradakilerin beşte birini vi
sayıyorum ...

WSL? Vay ... Ben WSL eklersiniz düşünmüyordu o ne demek için birçok sistem çağrıları.
muru

@muru Cygwin - WSL henüz hazır değil stackoverflow.com/a/40370009
Steven Penny
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.