Odpowiedzi:
Prostą odpowiedzią jest to, że ksh jest napisane w ten sposób (a bash jest kompatybilny). Ale jest powód tego wyboru projektu.
Większość poleceń wymaga wprowadzania tekstu. W świecie unix plik tekstowy składa się z sekwencji wierszy, z których każda kończy się nową linią . Tak więc w większości przypadków wymagana jest ostateczna nowa linia. Szczególnie częstym przypadkiem jest chwytanie wyniku polecenia za pomocą polecenia polecenia, przetworzenie go w jakiś sposób, a następnie przekazanie do innego polecenia. Podstawienie polecenia usuwa ostatnie znaki nowej linii; <<<
odkłada jeden z powrotem.
tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp
Bash i ksh i tak nie potrafią manipulować danymi binarnymi (nie radzi sobie ze znakami zerowymi), więc nic dziwnego, że ich funkcje są ukierunkowane na dane tekstowe.
<<<
Składnia tu sznurek jest przeważnie tylko dla wygody i tak, jak <<
tu-dokumentów. Jeśli nie chcesz dodawać końcowej nowej linii, użyj echo -n
(w bash) lub printf
potoku.
<<<
został wprowadzony do świata Bourne'a przez zsh
, nie ksh
. Został zainspirowany podobnym operatorem w porcie Unix, rc
który nie dodał tego dodatkowego znaku nowej linii. Co ciekawe, =(<<<text)
operator nie dodaje tej nowej linii do zsh
.
printf
itp.), Unikając wstawiania nowej linii bash
? Jak wskazano @ StéphaneChazelas jest możliwe w zsh
.
Jednym ze scenariuszy, w których praktyczne jest dołączanie znaków nowej linii do ciągów tutaj, jest użycie read
polecenia, gdy set -e
tryb jest aktywny. Przypomnijmy, że set -e
powoduje zakończenie skryptu, gdy (mniej więcej) napotka instrukcje, które generują niezerowy kod statusu. Rozważ, że read
generuje niezerowy kod stanu, gdy napotka ciąg bez znaków nowej linii:
#!/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'
Myślę, że to jedyny sposób, aby uzyskać nowy wiersz na końcu tutaj-dowód, dowód:
xxd <<<`echo -ne "a\n"`
Wygląda na to, że operator ciągu znaków usuwa nowe wiersze, chyba że podano je w przesłanej składni.
xxd <<<$(echo a)
.