Tại sao không có lệnh shell để tạo tập tin?


27

Xin chú ý:

Tôi không hỏi làm thế nào để tạo một tập tin từ dòng lệnh!


Tôi đã sử dụng touchđể tạo các tập tin trong nhiều năm mà không chú ý rằng mục đích chính của nó là một cái gì đó khác. Nếu một người muốn tạo một tệp từ dòng lệnh, có rất nhiều khả năng:

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

Và tôi chắc chắn có nhiều hơn nữa.

Nhưng thực tế là, không có lệnh nào ở trên thực sự được thiết kế để tạo tập tin. Ví dụ: man touchgợi ý lệnh này là để thay đổi dấu thời gian của tệp. Tại sao một hệ điều hành hoàn chỉnh như Unix (hoặc Linux) không có lệnh chỉ được thiết kế để tạo tệp?


35
Tại sao bạn lại làm lộn xộn hệ thống để thêm một lệnh để làm một cái gì đó có thể được thực hiện hàng tá cách với các công cụ đã tồn tại?
Michael Kohne

4
Tại sao không có lệnh để đọc tệp từ / đến luồng / stdin / out? Mọi người sử dụng lệnh dành cho caten enation!
SF.

2
@MichaelKohne, tôi thấy quan điểm của bạn, với tất cả sự tôn trọng, tôi có một vấn đề với nó. Với cách tiếp cận này, có nhiều lệnh chỉ làm lộn xộn hệ thống. Tại sao sử dụng morekhi lesslàm nhiều hơn những gì morelàm!? Hoặc dirls. Mặc dù, tôi nhận thức được các vấn đề tương thích.
Pouya

9
morecó trước sự sáng tạo của less. lessđã được tạo ra đặc biệt để giải quyết những thiếu sót của more. morevẫn tồn tại vì lý do tương thích ngược. dirls, đối với hầu hết các ý định và mục đích, cùng một tệp thực thi - chúng chỉ khác nhau ở một số byte. Một công cụ mới dành riêng cho việc tạo tệp sẽ làm ít hơn các công cụ hiện có và như vậy nó sẽ là một hồi quy, không phải là một cải tiến như trong trường hợp lessso với more.
lanzz

1
Thêm vào đó, chúng ta cần xem xét di sản, Unix được tạo khi mỗi byte được tính. Tại sao tạo tiện ích cho tác vụ mà bạn có thể thực hiện với tiện ích đã có?
Thomas

Câu trả lời:


38

Tôi sẽ nói bởi vì hầu như không cần thiết phải tạo một tệp trống mà bạn sẽ không điền nội dung ngay lập tức trên dòng lệnh hoặc trong tập lệnh shell.

Hoàn toàn không có lợi ích trong việc tạo tệp trước và sau đó sử dụng chuyển hướng I / O để ghi vào tệp nếu bạn có thể làm như vậy trong một bước.

Trong những trường hợp mà bạn thực sự muốn tạo một tập tin trống và để lại nó, tôi cho rằng > "${file}"không thể nào đẹp hơn và thanh lịch hơn.

TL; DR : Nó không tồn tại bởi vì việc tạo các tệp trống thường không có sử dụng và trong trường hợp nó đã có vô số tùy chọn có sẵn để đạt được mục tiêu này.

Mặt khác, touchchỉ sử dụng hoạt động nếu tệp không tồn tại trong khi các tùy chọn sử dụng chuyển hướng sẽ luôn cắt bớt tệp, ngay cả khi nó tồn tại (về mặt kỹ thuật, các giải pháp đó không giống nhau). > foolà phương pháp ưa thích vì nó tiết kiệm forkecho -nnên tránh nói chung vì nó không khả thi.


1
Tôi thấy quan điểm của bạn về việc tạo tệp và sau đó sử dụng các công cụ I / O, rất chắc chắn. Cảm ơn bạn.
Pouya

1
@FaheemMitha Có ( >>). Tôi đã tham khảo các ví dụ được đưa ra bởi OP bằng cách sử dụng >. Việc thêm vào sẽ khá vô ích nếu những gì bạn đang theo sau là tạo tệp (hoặc NOOP nếu chúng tồn tại).
Adrian Frühwirth

1
Đừng quên rằng noclobberkhông được đặt để >ghi đè lên tệp hiện có.
Ouki

1
@Ouki AFAIK, cài đặt không phải là hành vi mặc định và người ta có thể quên rằng nó được đặt trên một hệ thống chứ không phải hệ thống khác, có khả năng dẫn đến rắc rối giống như cách tạo ra một alias rm='rm -i'thay vì alias rmi='rm -i'là một ý tưởng tồi.
Búa búa Agi

1
@mikeerv ,, > .filetrên một dòng lệnh, sẽ làm điều đó hoàn toàn tốt mà không cần :.
Charles Duffy

16

Câu trả lời của Adrian Frühwirth là đúng. Tôi chỉ muốn thêm rằng thực sự có một lệnh được viết riêng để tạo tệp : 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.

Cấp, mktempcông việc không phải là tạo một tệp với một tên cụ thể, nó chỉ đơn giản là tạo một tệp . Tuy nhiên, như bạn đã được thông báo, có rất nhiều cách hiệu quả và thanh lịch hơn để tạo các tệp với một tên cụ thể cung cấp một lệnh cho điều đó sẽ là vô nghĩa.

Điều đó nói rằng, bạn cũng có truncatefallocatecả hai mục đích thiết yếu của họ là tạo tập tin. Họ chỉ đơn giản là có một cách tiếp cận tinh vi hơn. Sẽ không bao giờ có một chương trình đơn giản làm những gì > filevì không có cách nào nó sẽ tốt hơn > file.


11

Hầu hết các công cụ shell cơ bản không được thiết kế cho bất kỳ mục đích rất cụ thể nào cả. Hầu hết các công cụ shell cơ bản được thiết kế chỉ để tương tác với người khác để đạt được mục đích của bạn. Hoặc có lẽ nên nói rằng hầu hết các công cụ chỉ làm một điều rất cơ bản bất kể chúng có thể được kết hợp như thế nào để đạt được mục tiêu.

: >./file

Điều đó tạo ra một tập tin trống. Hoặc cắt bớt một tập tin hiện có như bạn muốn. Bạn có thể:

set -o noclobber

để tránh mọi khả năng của trường hợp sau trừ khi bạn:

: >|./file

Bạn có thể có hành vi tương tự touchvới:

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

Ngoại trừ việc :sẽ không cập nhật thời gian sửa đổi của tệp vì nó không được sửa đổi.

BẢN GIỚI THIỆU

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

ĐẦU RA

-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

KHÔNG CHẠM VÀO

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

ĐẦU RA

-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

Theo mặc định, echo thêm \nvào cuối dòng. Hãy thử echo -n >echo-n.file(size = 0) và echo -e >echo-e.file(size = 1)
Thomas

@Thomas 'Một chuỗi được ghi vào đầu ra tiêu chuẩn. Nếu toán hạng đầu tiên là -n hoặc nếu bất kỳ toán hạng nào chứa ký tự dấu gạch chéo ngược ('\'), thì kết quả được xác định theo thực hiện. Trên các hệ thống tuân thủ XSI, nếu toán hạng đầu tiên là -n, nó sẽ được coi là một chuỗi, không phải là một tùy chọn. Các chuỗi ký tự sau sẽ được nhận ra trên các hệ thống tuân thủ XSI trong bất kỳ đối số nào ... ' pubs.opengroup.org/onlinepub/009604599/utilities/echo.html
mikeerv

Đủ công bằng, cảm ơn vì liên kết và nhận xét của tôi dù sao cũng không phải là vấn đề
Thomas

2
Vâng thực sự và xin lỗi, tôi có nghĩa là bình luận của tôi đã thiếu quan điểm của câu trả lời của bạn, xin lỗi về điều đó.
Thomas

1
Một minh họa về xu hướng khái quát hóa Unix là thực tế là lệnh hiển thị nội dung của tệp được gọi cat. Tại sao có một lệnh để hiển thị một tệp, khi bạn có thể tạo một lệnh để ghép nhiều tệp thành đầu ra tiêu chuẩn?
200_success

1

Tiện ích installnày thực sự được thiết kế để tạo tập tin! Bạn có thể chuyển nội dung của tệp qua /dev/stdin(trong hầu hết các trường hợp, tuy nhiên, trên hầu hết các hương vị của Linux, điều này đòi hỏi phải /procđược gắn kết) hoặc cung cấp một tệp nguồn khác. Bạn có thể đặt quyền sở hữu và quyền.

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

như một ví dụ ngớ ngẩn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.