Sự khác biệt trong việc sử dụng tập tin cảm ứng của người dùng ở đâu


13

Tôi mới dùng Linux. Khi tôi tạo một tệp mới .gitignore trong thư mục hiện tại bằng cách sử dụng bash, tôi phát hiện ra rằng tôi có thể làm:

> .gitignore

hoặc là

touch .gitignore

Có vẻ như họ làm điều tương tự. Khi tôi kiểm tra hướng dẫn sử dụng touch, nó báo thay đổi dấu thời gian cho tệp hiện tại, nhưng không có hướng dẫn sử dụng >. Vì vậy, ai đó có thể giải thích những gì có thể >làm và có sự khác biệt trong việc sử dụng hai lệnh này trong bối cảnh này? Cảm ơn.


1
Tôi tò mò nơi bạn đã học cách sử dụng '>' như một trình tạo tệp mà không tìm hiểu mục đích sử dụng của nó
forresthopkinsa

1
Bạn sẽ tìm thấy chuyển hướng được ghi lại trong hướng dẫn Bash. Tại dòng lệnh, nhập lệnh man bash. Đó là một tài liệu dài và sẽ mất nhiều ngày hoặc thậm chí vài tuần để hiểu rõ, nhưng cũng đáng để xem qua nếu bạn muốn tìm hiểu kỹ về Bash.
Paddy Landau

Câu trả lời:


21

>là toán tử chuyển hướng vỏ. Xem sự khác biệt giữa ">" và ">>" trong lệnh shell là gì? Khi nào tôi nên sử dụng <hoặc <() hoặc << và> hoặc> ()?Nó chủ yếu được sử dụng để chuyển hướng đầu ra của lệnh sang một tệp. Nếu tập tin không tồn tại, shell sẽ tạo nó. Nếu nó tồn tại, vỏ cắt nó (làm trống nó). Chỉ cần > filekhông có lệnh, vì vậy shell sẽ tạo một tệp, nhưng không có đầu ra nào được gửi đến nó, vì vậy hiệu ứng ròng là tạo ra một tệp trống hoặc làm trống một tệp hiện có.

touchlà một lệnh bên ngoài tạo tệp hoặc cập nhật dấu thời gian, như bạn đã biết. Vớitouch , nội dung tập tin không bị mất, nếu nó tồn tại, không giống với >.

Các hành vi của >phụ thuộc vào vỏ. Trong bash, dash và hầu hết các shell, > foosẽ hoạt động như bạn mong đợi. Trong zsh, theo mặc định, > foohoạt động như cat > foo- zsh chờ bạn nhập dữ liệu.


10
Điểm mấu chốt ở đây là không có sự khác biệt thực tế giữa >> filetouch filenếu filekhông tồn tại, có một sự khác biệt lớn giữa cả hai và > file(trong đó các nội dung trước đó filebị mất). Điều đó, cộng với hành vi không nhất quán của phương tiện zsh touch filelà "an toàn nhất" và do đó nên được ghi nhớ là Cách đúng để làm điều đó.
Monty Harder

1

Đây là một so sánh thú vị:

$ 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'

Kết quả:

$ 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
Mặc dù so sánh có thể thú vị, tôi không thực sự thấy những gì bạn muốn tôi thấy ở đây. Bạn có thể giải thích những gì bạn đang đi? Tôi đoán đó là những cách khác nhau để ghi nội dung vào tập tin, nhưng tôi thấy nó hơi khó hiểu như thế này. Có thể là thiếu cà phê của tôi mặc dù.
m00am

@ m00am những gì được hiển thị ở đây có hiệu quả 8 cách khác nhau để tạo một tệp. straceđược cho là hiển thị các cuộc gọi hệ thống đang được thực hiện và > file.txtphương thức được hiển thị là số lượng cuộc gọi hệ thống được thực hiện ít nhất, điều này thực sự không đáng ngạc nhiên - một công cụ càng phức tạp thì các tòa nhà của nó càng phức tạp. Tuy nhiên, vấn đề với các ví dụ được hiển thị là straceghi vào stderrluồng theo mặc định và trong câu trả lời này, Steven chỉ sử dụng đường ống để đọc stderr, vì vậy tôi hơi bối rối khi anh ta đếm các dòng bằng cách sử dụng |ống và không|&
Sergiy Kolodyazhnyy

Và trên Ubuntu 16.04, bằng cách sử dụng |&, như @Serg đề cập, tôi nhận được khoảng một phần năm số đó ở đây ... ngoại trừ vitrường hợp, nơi tôi nhận được cùng một giá trị
muru

WSL? Ái chà ... Tôi không nghĩ WSL sẽ thêm rằng nhiều hệ thống gọi cho những gì nó làm.
muru

@muru Cygwin - WSL chưa sẵn sàng stackoverflow.com/a/40370009
Steven Penny
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.