Poniższe przykłady pokazują, że nowy ciąg jest dodawany do ciągu tutaj .
Dlaczego to się dzieje?
xxd -p <<<'a'
# output: 610a
xxd -p <<<'a
'
# output: 610a0a
źródło
Poniższe przykłady pokazują, że nowy ciąg jest dodawany do ciągu tutaj .
Dlaczego to się dzieje?
xxd -p <<<'a'
# output: 610a
xxd -p <<<'a
'
# output: 610a0a
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 przezzsh
, nieksh
. 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 dozsh
.printf
itp.), Unikając wstawiania nowej liniibash
? Jak wskazano @ StéphaneChazelas jest możliwe wzsh
.Jednym ze scenariuszy, w których praktyczne jest dołączanie znaków nowej linii do ciągów tutaj, jest użycie
read
polecenia, gdyset -e
tryb jest aktywny. Przypomnijmy, żeset -e
powoduje zakończenie skryptu, gdy (mniej więcej) napotka instrukcje, które generują niezerowy kod statusu. Rozważ, żeread
generuje niezerowy kod stanu, gdy napotka ciąg bez znaków nowej linii:źródło
Myślę, że to jedyny sposób, aby uzyskać nowy wiersz na końcu tutaj-dowód, dowód:
Wygląda na to, że operator ciągu znaków usuwa nowe wiersze, chyba że podano je w przesłanej składni.
źródło
xxd <<<$(echo a)
.