Khi tạo một tệp trống, tại sao người ta có thể thích 'chạm vào tệp' hơn ': >> tệp'?


33

Không bao giờ nhận ra rằng bạn có thể làm điều này cho đến bây giờ:

: >> file

Nó dường như có chức năng tương tự như:

touch file

Có một lý do tại sao hầu hết các tài nguyên dường như thích chạm vào lớp vỏ này?


7
Các hình thức ngắn có thể liên quan đến vỏ, trong khi cảm ứng là một lệnh độc lập. Do đó, hình thức ngắn phụ thuộc vào loại vỏ bạn sử dụng (và mọi người có sở thích mạnh mẽ trong lĩnh vực này) vì có thể không phải tất cả chúng đều cung cấp lối tắt. touchđộc lập sẽ hoạt động theo cùng một cách bất cứ điều gì bạn nên sử dụng.
Patrick Mevzek


6
Ví dụ đầu tiên nên được chỉnh sửa thành : >> filehoặc thậm chí >> file, để chúng có cùng tác dụng, tức là KHÔNG hủy nội dung của tệp.
user000001

2
touchchủ yếu cập nhật mtime. Nó không làm trống một tập tin hiện có không giống như >.
rexkogitans

2
Không có lệnh "tạo một tập tin trống"; họ chỉ có kết quả này nếu tập tin chưa tồn tại. Để đảm bảo một tập tin trống, bạn cần > file.
alexis

Câu trả lời:


47

Bạn thậm chí không cần sử dụng :; bạn chỉ có thể > file(ít nhất là trong bash; các vỏ khác có thể hoạt động khác đi).

Trong thực tế, không có sự khác biệt thực sự ở đây (mặc dù chi phí rất nhỏ của việc gọi ra /bin/touchlà một điều).

touchtuy nhiên, cũng có thể được sử dụng để sửa đổi dấu thời gian trên một tệp đã tồn tại mà không thay đổi hoặc xóa nội dung; hơn nữa, > filesẽ thổi bay bất kỳ filecái gì đã tồn tại Điều này có thể được làm việc xung quanh bằng cách sử dụng >> file.

Một điểm khác biệt nữa touchlà bạn có thể tạo nó (hoặc cập nhật dấu thời gian trên) nhiều tệp cùng một lúc (ví dụ touch foo bar baz quux) với cú pháp ngắn gọn hơn so với chuyển hướng, trong đó mỗi tệp cần chuyển hướng riêng (ví dụ >foo >bar >baz >quux).

Sử dụng touch:

$ touch foo; stat -x foo; sleep 2; touch foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:19 2018
Modify: Fri May 25 10:55:19 2018
Change: Fri May 25 10:55:19 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:55:21 2018
Change: Fri May 25 10:55:21 2018

Sử dụng chuyển hướng:

$ > foo; stat -x foo; sleep 2; >> foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018

6
Có vẻ như >> filesẽ không cập nhật thời gian sửa đổi. Không phải những gì OP đang tìm kiếm mà chỉ muốn chỉ ra rằng nó dường như không phải là một sự thay thế hoàn toàn cho cảm ứng.
Jesse_b

2
Vì câu hỏi không chỉ định một vỏ cụ thể. Có thể là tốt để chỉ ra rằng > filetrong zsh là tương đương với cat > file, không : > file.
JoL

Ngoài ra, tcsh cho phép : > file, nhưng lỗi trên > file. Có lẽ sự tương đương của > fileđể : > fileđược giới hạn ở những vỏ bourne và bash?
JoL

Tuy nhiên, +1 cho tính kỹ lưỡng, lưu ý rằng trên một số shell chính (tôi thậm chí sẽ đoán tất cả hoặc hầu hết các shell vì việc thực hiện đơn giản nhất sẽ khiến điều này hoạt động như một hiệu ứng phụ), bạn có thể chạm vào nhiều tệp bằng cách sử dụng chuyển hướng shell: : >foo >barhoặc : >>foo >>barsẽ chạm cả hai foobar.
mtraceur

Chỉ để được mô phạm vì bối cảnh của câu hỏi thực tế ở đây, nhưng : >foo >barsẽ không phải touchlà các tập tin; nó sẽ chuyển hướng đầu ra (null) : vào các tập tin. touchsẽ chạm vào các tập tin. (:
DopeGhoti

32

Bởi vì bạn có thể touchnhiều tệp cùng một lúc mà không cần nhập thêm bất kỳ ký tự đặc biệt nào. Điều đó bao gồm những thứ như mở rộng cú đúp, ví dụ touch file{1,2,3,4}.

Một vấn đề khác là khi bạn viết một bài hướng dẫn, điều quan trọng là phải nhận ra rằng độc giả của bạn có thể không rành về chủ đề này. Một lệnh đơn giản có thể dễ hiểu hơn nhiều so với một số kết hợp trông kỳ lạ của các ký tự không phải chữ cái. Tôi hy vọng sẽ có một số người dùng shell thông thường không biết nó :là gì , vì lý do đơn giản là nó không thực sự làm gì cả. Tương tự như vậy đối với đồng bằng > fookhông có lệnh: ngay cả khi bạn biết chuyển hướng là gì, chuyển hướng không có nguồn có thể không trực quan.

Ngoài ra, ở đây trên unix.se, chúng tôi thường viết các mẫu lệnh với ký hiệu đô la hàng đầu để chỉ ra lời nhắc. Các ký tự đặc biệt ở đầu dòng có thể bị nhầm lẫn với điều đó. (Lưu ý rằng có các hệ thống và hệ vỏ sử dụng >như một phần của dấu nhắc mặc định.)


4
Và nếu lệnh không hoàn toàn được hiểu, luôn có "người đàn ông chạm". Tôi nghi ngờ rằng "man:> file" sẽ trả về bất cứ điều gì hữu ích :-) Ngoài ra, các nhắc nhở của WRT, một số (có lẽ hầu hết) cho phép bạn đặt lời nhắc thành bất cứ điều gì bạn thích. Của tôi hiển thị tên hệ thống (vì tôi sử dụng rất nhiều xterms từ xa) và thư mục hiện tại, và được đặt thành các màu khác nhau cho các hệ thống khác nhau.
jamesqf

1
@jamesqf, vâng. Bây giờ, tất nhiên cũng có help :hoặc bất cứ thứ gì vỏ của bạn có cho tài liệu. Nhưng điều đó đòi hỏi phải tự nhận :là một lệnh, nhớ rằng không phải mọi thứ đều có trang con người, và cuối cùng, có thể tìm thấy :trong tài liệu. Phần cuối có thể khá khó khăn. : D
ilkkachu

@jamesqf, và vâng, tôi chủ yếu là nhân vật cuối cùng của dấu nhắc mặc định.
ilkkachu

1
+1 để chỉ ra các khía cạnh trực giác và không tồn tại khó hiểu.
mtraceur

@ilkkachu: Vâng. Tìm dấu hai chấm trong tài liệu không khó lắm: tìm một dấu không chỉ chấm câu là một vấn đề khác :-)
jamesqf

18

Vâng, đối với tôi, lý do chính là khả năng đọc. Với touch filebạn biết những gì đang xảy ra, ngay cả một người không được giáo dục về kịch bản shell cũng biết những gì đang xảy ra. Và nếu không, thật dễ dàng để làm man touchđiều này:

A FILE argument that does not exist is created empty

Với những thứ khó hiểu như :>, thật khó để biết chuyện gì đang xảy ra, và vì không có lợi thế thực sự, nên không cần phải sử dụng nó.


6

Hãy tưởng tượng rằng bạn đang tìm kiếm một trong các tập lệnh shell cũ mà bạn chỉ nhớ rằng một số tệp đánh dấu trong / tmp đang được tạo. Thật dễ dàng để grep tất cả các tệp * .sh của bạn cho từ "chạm". Thay vào đó, cắt xén cho một dấu hai chấm sẽ mang lại nhiều kết quả dương tính giả nếu bạn không biết tên tệp chính xác nào cần tìm kiếm.

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.