Câu trả lời:
Câu trả lời dễ dàng là vì ksh được viết theo cách đó (và bash tương thích). Nhưng có một lý do cho sự lựa chọn thiết kế đó.
Hầu hết các lệnh mong đợi nhập văn bản. Trong thế giới unix, một tệp văn bản bao gồm một chuỗi các dòng, mỗi dòng kết thúc bằng một dòng mới . Vì vậy, trong hầu hết các trường hợp, một dòng mới cuối cùng là bắt buộc. Một trường hợp đặc biệt phổ biến là lấy đầu ra của lệnh bằng lệnh susbtlation, xử lý nó theo một cách nào đó, sau đó chuyển nó sang lệnh khác. Lệnh thay thế dải mới dòng cuối cùng; <<<
đặt một trở lại.
tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp
Bash và ksh không thể thao túng dữ liệu nhị phân (dù sao nó không thể đối phó với các ký tự null), vì vậy không có gì đáng ngạc nhiên khi các cơ sở của chúng hướng đến dữ liệu văn bản.
Các <<<
cú pháp ở đây-string là chủ yếu chỉ để thuận tiện dù sao, như <<
ở đây-tài liệu. Nếu bạn không cần thêm một dòng mới cuối cùng, hãy sử dụng echo -n
(trong bash) hoặc printf
và một đường ống dẫn.
<<<
được giới thiệu với thế giới Bourne bởi zsh
, không ksh
. Và nó được lấy cảm hứng từ một nhà điều hành tương tự tại cảng Unix của rc
mà đã không nói thêm rằng thêm ký tự xuống dòng. Thật thú vị, =(<<<text)
nhà điều hành không thêm dòng mới vào zsh
.
printf
, v.v.) để tránh dòng mới trong đuôi bash
không? Giống như @ StéphaneChazelas nhọn là có thể trong zsh
.
Một kịch bản trong đó thực tế là có các dòng mới được thêm vào đây - chuỗi là khi sử dụng read
lệnh khi set -e
chế độ được kích hoạt. Nhớ lại set -e
khiến kịch bản chấm dứt khi nó (nhiều hơn hoặc ít hơn) gặp các câu lệnh tạo mã trạng thái khác không. Hãy xem xét việc read
tạo mã trạng thái khác không khi nó gặp một chuỗi không có dòng mới:
#!/bin/bash
set -e
# The following statement succeeds because here-strings append a newline:
IFS='' read -r <<< 'newline appended'
echo 'Made it here'
# The following statement fails because 'read' returns a non-zero status
# code when no newlines are encountered.
printf 'no newline' | IFS='' read -r
echo 'Did not make it here'
Tôi nghĩ đó là cách duy nhất để có được một dòng mới ở cuối chuỗi ở đây - bằng chứng:
xxd <<<`echo -ne "a\n"`
Dường như toán tử chuỗi ở đây loại bỏ các dòng mới trừ khi chúng được đưa ra theo cú pháp bạn đã gửi.
xxd <<<$(echo a)
.