Tại sao wc <<< Phiên bản $ chuỗi Hồi hiển thị độ dài dài hơn một byte so với printf Ít $ chuỗi | wc?


11

Tình cờ, tôi phát hiện ra rằng wctính khác nhau tùy thuộc vào cách nó nhận đầu vào từ bash:

$ s='hello'
$ wc -m <<<"$s"
6
$ wc -c <<<"$s"
6
$ printf '%s' "$s" | wc -m
5
$ printf '%s' "$s" | wc -c
5

Đây có phải - IMHO khó hiểu - hành vi được ghi lại ở đâu đó? Những gì wcđược tính ở đây - đây có phải là một dòng mới giả định?


3
Bạn luôn có thể đặt ống od -cđể xem chính xác những gì bạn có.
Thorbjørn Ravn Andersen

Hoặc, tốt hơn , xxd -g1.
Ruslan

1
Tôi hy vọng printf "$s"không phải là kịch bản thực tế của bạn ... hy vọng bạn có ý nghĩaprintf "%s" "$s"
user541686

Vì có rất nhiều ý kiến ​​về printf, tôi đã chỉnh sửa bài viết của mình để phản ánh thực tiễn tốt nhất.
rexkogitans

Câu trả lời:


38

Sự khác biệt là do một dòng mới được thêm vào chuỗi ở đây. Xem hướng dẫn sử dụng Bash :

Kết quả được cung cấp dưới dạng một chuỗi, với một dòng mới được nối vào lệnh trên đầu vào tiêu chuẩn của nó (hoặc mô tả tệp n nếu n được chỉ định).

wc đang tính theo cùng một cách, nhưng đầu vào của nó là khác nhau.


7
Nếu cần lưu ý rằng để in nội dung (tùy ý) của một biến không có ký tự dòng mới được thêm vào, thì nó phải là printf %s "$var"(hoặc print -rn -- "$var"với các vỏ giống như ksh), không printf "$var"phải là không hoạt động chính xác cho các giá trị của $varcác %ký tự chứa hoặc dấu gạch chéo ngược (hoặc bắt đầu với -hầu hết các triển khai).
Stéphane Chazelas

Lưu ý rằng việc triển khai chuỗi gốc ở đây trong cổng Unix rckhông thêm ký tự dòng mới đó.
Stéphane Chazelas

26

Đây là một dòng mới thành công được thêm vào bởi trình chuyển hướng chuỗi ở đây:

$ s="hello"
$ hexdump -C <<<"$s"
00000000  68 65 6c 6c 6f 0a                                 |hello.|
00000006
$ printf "$s" | hexdump -C
00000000  68 65 6c 6c 6f                                    |hello|
00000005
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.