Mengapa tidak ada perintah shell untuk membuat file?

27

Dimohon perhatiannya:

Saya tidak bertanya bagaimana cara membuat file dari baris perintah!


Saya telah menggunakan touchuntuk membuat file selama bertahun-tahun tanpa memperhatikan bahwa tujuan utamanya adalah sesuatu yang lain. Jika seseorang ingin membuat file dari baris perintah ada begitu banyak kemungkinan:

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

Dan saya yakin masih ada lagi.

Tetapi faktanya, tidak ada perintah di atas yang benar-benar dirancang untuk membuat file. Misalnya, man touchmenyarankan perintah ini untuk mengubah stempel waktu file. Mengapa OS tidak selengkap Unix (atau Linux) hanya memiliki perintah yang dirancang untuk membuat file?

Pouya
sumber
35
Mengapa Anda akan mengacaukan sistem untuk menambahkan perintah untuk melakukan sesuatu yang dapat dilakukan selusin cara dengan alat yang sudah ada?
Michael Kohne
4
Mengapa tidak ada perintah untuk membaca file dari / ke stream / stdin / out? Semua orang menggunakan perintah yang dimaksudkan untuk catkonvensi!
SF.
2
@MichaelKohne, saya mengerti maksud Anda, dengan segala hormat, saya punya masalah dengannya. Dengan pendekatan ini ada banyak perintah yang hanya mengacaukan sistem. Mengapa menggunakan morekapan lesslebih dari apa yang moredilakukan !? Atau dirdan ls. Meskipun demikian, saya mengetahui masalah kompatibilitas.
Pouya
9
moresebelum penciptaan less. lesstelah dibuat khusus untuk mengatasi kekurangan more. moremasih ada karena alasan kompatibilitas ke belakang. dirdan ls, untuk sebagian besar maksud dan tujuan, dapat dieksekusi sama - mereka hanya berbeda dalam beberapa byte. Sebuah alat baru yang ditujukan khusus untuk membuat file akan melakukan kurang dari alat yang ada, dan karena itu akan menjadi regresi, bukan perbaikan seperti dalam kasus lessvs more.
lanzz
1
Ditambah lagi kita perlu melihat warisan, Unix dibuat ketika setiap byte dihitung. Mengapa membuat utilitas untuk tugas yang dapat Anda lakukan dengan utilitas yang sudah ada?
Thomas

Jawaban:

38

Saya akan mengatakan karena hampir tidak pernah diperlukan untuk membuat file kosong yang Anda tidak akan segera isi dengan pada baris perintah atau dalam skrip shell.

Sama sekali tidak ada manfaat dalam membuat file pertama dan kemudian menggunakan pengalihan I / O untuk menulis ke file jika Anda dapat melakukannya dalam satu langkah.

Dalam kasus-kasus di mana Anda benar-benar ingin membuat file kosong dan meninggalkannya, saya berpendapat itu > "${file}"tidak bisa lebih singkat dan lebih elegan.

TL; DR : Itu tidak ada karena membuat file kosong paling sering tidak digunakan, dan dalam kasus itu sudah ada segudang pilihan yang tersedia untuk mencapai tujuan ini.

Di samping catatan, menggunakan touchhanya berfungsi jika file tidak ada sedangkan opsi menggunakan pengalihan akan selalu memotong file, bahkan jika ada (jadi secara teknis, solusi tersebut tidak identik). > fooadalah metode yang disukai karena menyimpan a forkdan echo -nharus dihindari secara umum karena sangat tidak dapat diport.

Adrian Frühwirth
sumber
1
Saya menemukan maksud Anda tentang membuat file dan kemudian menggunakan alat I / O, sangat solid. Terima kasih.
Pouya
1
@FaheemMitha Ya ( >>). Saya merujuk pada contoh yang diberikan oleh OP menggunakan >. Menambahkan akan sangat tidak berguna jika apa yang Anda cari adalah membuat file (atau NOOP keluar jika ada).
Adrian Frühwirth
1
Jangan lupa yang noclobberbelum diatur sehingga >akan menimpa file yang sudah ada.
Ouki
1
@Ouki AFAIK, pengaturan yang bukan perilaku default dan orang bisa lupa bahwa itu diatur pada satu sistem dan bukan yang lain, berpotensi menyebabkan masalah dengan cara yang sama dengan membuat alias rm='rm -i'alih - alih alias rmi='rm -i'adalah ide yang buruk.
Agi Hammerthief
1
@ mikeserv, > .filepada baris perintah saja, akan melakukannya dengan sangat baik tanpa :.
Charles Duffy
16

Jawaban Adrian Frühwirth tepat. Saya hanya ingin menambahkan bahwa sebenarnya ada perintah khusus ditulis untuk membuat file: 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.

Memang, mktemptugasnya bukan untuk membuat file dengan nama tertentu, itu hanya untuk membuat file . Namun, seperti yang telah Anda ketahui, ada begitu banyak cara yang lebih efisien dan elegan untuk membuat file dengan nama tertentu yang memberikan perintah untuk itu tidak ada gunanya.

Yang mengatakan, Anda juga memiliki truncatedan fallocatekeduanya yang tujuan utamanya adalah untuk membuat file. Mereka hanya memiliki pendekatan yang lebih canggih. Tidak akan pernah ada program sederhana yang melakukan apa yang > filedilakukan karena tidak ada cara yang lebih baik dari itu > file.

terdon
sumber
11

Sebagian besar alat shell dasar tidak dirancang untuk tujuan yang sangat spesifik sama sekali. Sebagian besar alat shell dasar dirancang hanya untuk berinteraksi dengan orang lain untuk mencapai tujuan Anda. Atau mungkin bisa dikatakan bahwa sebagian besar alat hanya melakukan satu hal yang sangat mendasar terlepas dari bagaimana mereka digabungkan untuk mencapai tujuan.

: >./file

Itu menciptakan file kosong. Atau memotong file yang ada seperti yang Anda mau. Kamu bisa:

set -o noclobber

untuk menghindari kemungkinan kasus terakhir kecuali Anda:

: >|./file

Anda bisa mendapatkan perilaku serupa touchdengan:

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

Kecuali itu :tidak akan memperbarui modtime file karena tidak dimodifikasi.

DEMO

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

KELUARAN

-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

TIDAK SENTUH

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

KELUARAN

-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
mikeserv
sumber
Secara default, gema ditambahkan \ndi akhir baris. Coba echo -n >echo-n.file(ukuran = 0) dan echo -e >echo-e.file(ukuran = 1)
Thomas
@Thomas 'String yang akan ditulis ke output standar. Jika operan pertama adalah -n, atau jika salah satu operan berisi karakter backslash ('\'), hasilnya adalah implementasi yang ditentukan. Pada sistem konforman XSI, jika operan pertama adalah -n, itu harus diperlakukan sebagai string, bukan opsi. Urutan karakter berikut harus dikenali pada sistem yang sesuai dengan XSI dalam argumen mana pun ... ' pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
mikeserv
Cukup adil, terima kasih atas tautannya, dan komentar saya bukan itu intinya
Thomas
2
Ya memang dan maaf, maksud saya komentar saya tidak ada gunanya jawaban Anda, maaf tentang itu.
Thomas
1
Ilustrasi kecenderungan Unix untuk menggeneralisasi adalah fakta bahwa perintah untuk menampilkan konten file disebut cat. Mengapa memiliki perintah untuk menampilkan satu file, ketika Anda dapat membuat satu perintah untuk menggabungkan beberapa file ke output standar?
200_sukses
1

Utilitas installsebenarnya dirancang untuk membuat file! Anda dapat mengirimkan konten file melalui /dev/stdin(dalam kebanyakan kasus, bagaimanapun, pada sebagian besar rasa Linux, ini mengharuskan yang /procdipasang) atau menyediakan file sumber lain. Anda dapat mengatur kepemilikan dan izin.

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

sebagai contoh konyol.

Otheus
sumber