Jaka jest różnica między używaniem
echo -e "Hello\nWorld"
i
echo $"Hello\nWorld"
czy nie oba generują:
Hello
World
command-line
bash
znak
źródło
źródło
Hello\nWorld
. Potrzebujesz-e
przełącznika, aby interpretować znaki specjalne.echo $'Hello\nWorld'
, które zostaną wydrukowane w dwóch wierszach pod bash.Odpowiedzi:
echo -e
iecho $'...'
oba są podobne, ponieważ obsługują następujące sekwencje specjalne:Mają różnice. Oprócz powyższych
echo -e
obsługuje:Natomiast
$'....'
obsługuje:Zauważ, że między nimi
\c
rozszerzenia są niezgodne:W
echo -e
powyższym przypadku\c
pomija dalsze dane wyjściowe, ignorując w ten sposóbIstop
. W przeciwieństwie do$'...'
The\cI
interpretowany jest jako zakładka.Forma podobna wizualnie:
$"..."
W przeciwieństwie do
$'...'
, funkcja$"..."
jest zupełnie inna. Spowoduje to przetłumaczenie zawartego w nim ciągu zgodnie z bieżącymi ustawieniami narodowymi.echo -e
kontrowersjeecho -e
nie jest powszechnie obsługiwany przez powłoki i wielu uważa tę-e
opcję za błąd projektowy. Przestrzegać:Jak widać, jeśli to, co drukujesz,
echo
zaczyna się od myślnika, wyniki mogą być nieoczekiwane. O ile nie masz pewności, że pierwszy ciąg, który będziesz drukowaćecho
, nie zaczyna się od myślnika, prawdopodobnie lepiej będzie użyćprintf
.Z tych powodów standard POSIX stwierdza :
Chet Ramey, który utrzymuje
bash
od 22 lat, zgadza się :źródło
printf
zamiastecho
*
) nie jest właściwie specyficznyecho
. Dzieje się tak z każdym poleceniem, które rozpoznaje krótkie lub długie opcje (napisane w tradycyjny sposób) i pobiera operandy nazw plików, w tymls
. Prawdopodobnie sytuacja jest nieco gorsza,echo
ponieważ (jak wspomina twoje źródło)echo
zazwyczaj nie akceptuje--
wskazania końca opcji, podczas gdy można pisać polecenia takie jakls -- *l
. (I tak naprawdę zwykle należy tak pisać polecenia, używając globów rozpoczynających się od*
lub-
, zwłaszcza w skryptach).\n
sekwencji ucieczki, więc w rzeczywistości nie ma znaczenia, czy mogę używaćecho -e '...'
,echo $'...'
lubecho $"..."