Neden dosya oluşturmak için herhangi bir kabuk komutu yok?


27

Lütfen dikkat:

Ben am değil komut satırından bir dosyayı nasıl soran!


touchAsıl amacının başka bir şey olduğuna dikkat etmeden yıllardır dosya yapmak için kullanıyorum . Eğer biri komut satırından bir dosya oluşturmak isterse, çok fazla olasılık var:

touch foo.bar
> foo.bar
cat > foo.bar
echo -n > foo.bar
printf '' > foo.bar

Ve eminim dahası var.

Fakat gerçek şu ki, yukarıdaki komutların hiçbiri aslında dosyalar oluşturmak için tasarlanmamıştır. Örneğin, man touchbu komutun dosya zaman damgalarını değiştirmek için olduğunu önerir. Neden Unix (veya Linux) kadar eksiksiz bir işletim sistemi yalnızca dosya oluşturmak için tasarlanmış bir komuta sahip değil?


35
Zaten var olan araçlarla bir düzine yolla yapılabilecek bir şeyi yapmak için bir komut eklemek için sistemi neden karıştırıyorsunuz?
Michael Kohne

4
Neden / streams / stdin / out dosyalarını okumak için komut yok? Herkes bağlantı için tasarlanan komutu kullanır cat!
SF.

2
@MichaelKohne, Amacınızı anlıyorum, tüm saygımla, bu konuda bir sorunum var. Bu yaklaşımla, sadece sistemi karıştıran birçok komut vardır. Neden kullanılmalıdır morezaman lessne fazla yapar morebunu !? Veya dirve ls. Yine de uyumluluk sorunlarının farkındayım.
Pouya

9
moreyaratılmasından önce less. lessözellikle eksiklikleri gidermek için yaratılmıştır more. moregeriye dönük uyumluluk nedenleriyle hala var. dirve lsçoğu amaç ve amaç için aynı çalıştırılabilir - bunlar yalnızca bir avuç bayt olarak değişir. Özellikle dosya oluşturmak için tasarlanan yeni bir araç , mevcut araçlardan daha az şey yapacaktır ve bu, lessvs durumundaki gibi bir gelişme değil, bir gerileme olacaktır more.
lanzz

1
Artı, mirasa da bakmamız gerekiyor, her bayt sayıldığında Unix oluşturuldu. Zaten var olan bir yardımcı programla yapabileceğiniz bir görev için neden bir yardımcı program oluşturun?
Thomas

Yanıtlar:


38

Çünkü derhal komut satırında veya kabuk komut dosyasında içerikle doldurmayacağınız boş bir dosya oluşturmak gerekmiyor.

Önce bir dosya oluşturmanın ve ardından bir adımda yapabiliyorsanız, dosyaya yazmak için G / Ç yönlendirmesini kullanmanın kesinlikle bir faydası yoktur.

Gerçekten boş bir dosya oluşturmak ve onu bırakmak istediğiniz > "${file}"durumlarda, daha şık ve daha zarif olamazdı.

TL; DR : Yok, çünkü boş dosyalar oluşturmak en sık kullanım dışıdır ve bu amaca ulaşmak için zaten sayısız seçenek vardır.

Bir yandan not, touchyalnızca dosya yoksa kullanmak işe yarar, oysa yönlendirmeyi kullanan seçenekler mevcut olsa bile dosyayı kısaltır (teknik olarak bu çözümler aynı değildir). > footasarruflu olduğu için tercih edilen yöntemdir forkve echo -ngenel olarak kaçınılması gerektiği için sakıncalı olmalıdır.


1
Dosya oluşturma ve daha sonra G / Ç araçlarını kullanma konusundaki amacınızı çok sağlam buldum. Teşekkür ederim.
Pouya

1
@FaheemMitha Evet ( >>). OP kullanarak verilen örneklere değiniyordum >. Sonradan yaptığınız şey dosya oluşturuyorsa (ya da varsa NOOP'u çıkarırsanız) eklemek oldukça işe yaramaz.
Adrian Frühwirth

1
Unutmayın ki noclobber, >mevcut bir dosyanın üzerine yazılacak.
Ouki

1
@Ouki AFAIK, varsayılan davranış olmayan ve birinin sisteme kurulduğunu unutabiliyordu, diğeri için sorun yaratmayacak, alias rm='rm -i'bunun yerine bir problem yaratmanın alias rmi='rm -i'kötü bir fikir olduğu gibi.
Agi Hammerthief,

1
@mikeserv, > .filetek başına bir komut satırında, bunu mükemmel bir şekilde yapacaktır :.
Charles Duffy

16

Adrian Frühwirth'in cevabı doğru. Sadece aslında özellikle dosyaları oluşturmak için yazılmış bir komut olduğunu eklemek istedim: mktemp.

NAME
       mktemp - create a temporary file or directory

SYNOPSIS
       mktemp [OPTION]... [TEMPLATE]

DESCRIPTION
       Create a temporary file or directory, safely, and print its name.  TEM
       PLATE must contain at least 3 consecutive 'X's in last  component.   If
       TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is implied.
       Files are created u+rw, and directories  u+rwx,  minus  umask  restric
       tions.

Verilen, mktempişinin belirli bir adı olan bir dosya oluşturmak değil, sadece bir dosya oluşturmaktır . Ancak, daha önce de söylendiği gibi, bunun için bir komut sağlayan anlamsız olacak belirli bir isimle dosya oluşturmanın çok daha etkili ve zarif yolları vardır.

Bununla birlikte, temel amacı dosya oluşturmak olan truncateve fallocateher ikisine de sahipsin . Onlar sadece daha sofistike bir yaklaşıma sahipler. Bundan > filedaha iyisini yapmanın bir yolu olmadığı için hiçbir zaman basit bir program olmayacak > file.


11

Çoğu temel kabuk aracı, hiçbir şekilde belirli bir amaç için tasarlanmamıştır . Çoğu temel kabuk aracı yalnızca amacınıza ulaşmak için başkalarıyla etkileşime geçmek üzere tasarlanmıştır . Veya belki de çoğu aracın, bir hedefe ulaşmak için nasıl birleştirildiklerine bakılmaksızın, yalnızca çok temel bir şey yaptıkları söylenmelidir.

: >./file

Bu boş bir dosya oluşturur. Veya varolan bir dosyayı istediğiniz gibi keser. Yapabilirsin:

set -o noclobber

Sizden sonraki durum için herhangi bir olasılığını önlemek için

: >|./file

Şununla benzer davranışlar elde edebilirsiniz touch:

: >>./file
: >>|./file

Bunun dışında :bir dosyanın modtime değerini değiştirmeyeceği için güncellemeyecektir.

DEMO

mkdir test ; cd $_
touch touch.file 
: >null.file
echo >echo.file
ls -l

ÇIKTI

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

DOKUNMA

: >>|./echo.file
ls -l 

ÇIKTI

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

Varsayılan olarak, yankı \nsatırın sonuna ekler . Deneyin echo -n >echo-n.file(beden = 0) ve echo -e >echo-e.file(beden = 1)
Thomas

@Thomas 'Standart çıktıya yazılacak bir dize. İlk işlenen -n ise veya işlenenlerden herhangi biri ters eğik çizgi ('\') karakteri içeriyorsa, sonuçlar uygulama tarafından tanımlanır. XSI uyumlu sistemlerde, ilk işlenen -n ise, bir seçenek değil, bir dize olarak değerlendirilir. Aşağıdaki karakter dizileri, herhangi bir argümandaki XSI uyumlu sistemlerde tanınır ... ' pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
mikeserv

Yeterince adil, bağlantı için teşekkürler, ve yorumum yine de önemli değil
Thomas

2
Evet, gerçekten de üzgünüm, yorumumun cevabın ne anlama geldiğini eksik demek istedim, bunun için üzgünüm.
Thomas

1
Unix'in genelleme eğiliminin bir örneği, bir dosyanın içeriğini görüntüleme komutunun çağrılmasıdır cat. Birden fazla dosyayı standart çıktıya birleştirmek için bir komut verebiliyorken neden bir dosyayı görüntülemek için bir komut kullanıyorsunuz?
200_success

1

Yardımcı program installaslında dosya oluşturmak için tasarlanmıştır! Dosyanın içeriğini /dev/stdin(çoğu durumda, ancak çoğu Linux'un tatlarında, bunun /procmonte edilmesini gerektirir ) üzerinden iletebilir veya başka bir kaynak dosya sağlayabilirsiniz. Sahipliği ve izinleri ayarlayabilirsiniz.

echo "New file" | install -o 0644 -m 452452 -g dumbass /dev/stdin /var/www/index.html

Aptal bir örnek olarak.

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.