Hành vi kiểm soát kỳ lạ


9

Tôi có thể sử dụng catnhư một trình soạn thảo văn bản rất đơn giản bằng cách làm cat > foo.txt.
Nếu tôi thì gõ:

bar
baz

và sau đó nhấn ctrl+ D, bây giờ nó trông như thế này:

$ cat > foo.txt
bar
baz^D

với con trỏ tại ^. Nếu tôi nhấn nó một lần nữa thì tập tin sẽ được lưu lại. Tuy nhiên nếu tôi nhấn bất cứ điều gì (có thể không phải bất cứ điều gì, nhưng chủ yếu là bất cứ điều gì) khác, tôi chỉ tiếp tục chỉnh sửa tệp.

Đây có phải là hành vi bình thường?

Câu trả lời:


13

Đúng. Nó phải làm với ^Dthực sự: nó chỉ dừng read(2)cuộc gọi hiện tại .

Nếu chương trình thực hiện int rdbytes = read(fd, buffer, sizeof buffer);và bạn nhấn ^Dinb between, read()trả về với các byte hiện đang đọc trong bộ đệm, trả về số của chúng. Điều tương tự cũng xảy ra khi chấm dứt dòng; những \nlúc kết thúc luôn được phân phối.

Vì vậy, chỉ có một ^Dở đầu một dòng hoặc sau một dòng khác ^Dcó tác dụng mong muốn là có read()trở lại 0, báo hiệu EOF.


Nó phụ thuộc vào những gì bạn xác định một dòng (có hoặc không có dấu \n.. nhưng có thể chỉ cần nhấn ^Dhai lần liên tiếp và gây ra tình trạng EOF mà không tạo ra một char dòng mới cuối cùng (như nhấn Enter trước khi ^Dthực hiện).
Peter.O

Bạn nói đúng, tôi quên đề cập rằng: Bắt đầu dòng và "chỉ nhấn ^ D" là hai tình huống trong đó bộ đệm trống, vì vậy ^ D sẽ read()quay trở lại 0, biểu thị EOF.
glglgl

11

Vâng, đây là hành vi bình thường. Một Control-D duy nhất thường chỉ nổ ra nếu đó là đầu dòng. Lối thoát này có một Control-D:

$ cat > foo.txt
bar
baz
^D

Control-D hai lần ở cuối một dòng sẽ nổ ra, mà không có một dòng mới char ...
Peter.O

Vâng bạn đã đúng. Tôi không có ý ám chỉ khác. Tôi chỉnh sửa câu trả lời của tôi để làm rõ.
Klox
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.