Czy ktoś może mi wyjaśnić, dlaczego to działa (wyświetlając zawartość katalogu, który ma w nazwie białe znaki):
ret="$(ls "my dir")"
Czy raczej nie powinno to być interpretowane jako:
ret="$(ls "
my dir
")"
Na przykład z:
ls "my" "dir"
i
ls "my dir"
"$("
byłby błąd składniowy ($
wewnątrz"
jest oceniany) i próbuje znaleźć inne dopasowanie, które umożliwia zagnieżdżenie"
w tym przypadku.bash
dopasowane (sparowane)?Odpowiedzi:
Jak na razie wydaje się, że pytasz:
Ten akapit bash (1) może to wyjaśnić:
Myślę, że to oznacza to, co zaobserwowałeś, a mianowicie, tekst między
$(
i)
jest traktowany jakby to było osobne polecenie, z własnym parsowaniem / parowaniem cytatów, niezależny od elementów składniowych poza nawiasami. Przyznaję, że jeśli nie szukasz tego znaczenia, bardzo trudno to zinterpretować.Ale twoje pytanie, jak napisano, nie ma sensu. Cała sprawa zależy od bardzo szczególnego znaczenia
$
do skorupy. Jeśli zmienimy to na inny symbol waluty,to byłoby traktowane jako dwa słowa:
ret="£(ls "my
(śledzony przez)
dir")"
ponieważ, jeśli pojawi się nie pusty, znak inny niż specjalny bezpośrednio przed kwotą otwarcia lub bezpośrednio po wycenie zamknięcia, jest zawarty w tym samym ciągu, co znaki zawarte w cudzysłowie. Na przykład,
szuka pliku o nazwie
Wal*mart
, nie plik o nazwieWal
, jeden nazywany*
i jeden wezwanymart
-Wal"*"mart
jest równaWal\*mart
i"Wal*mart"
. Podobnie poniższy przykład pokazuje cztery słowa:Nie wiem, skąd masz awarię trzech linii które pokazałeś w swoim pytaniu.
źródło