Pourquoi lors de la redirection de la variable vers la variable stdin doit être entre guillemets?

pourquoi cette expression fonctionne cat > d.txt <<< "$val" et cat > d.txt <<< $val ne fonctionne pas? Si je comprends bien, <<< redirige la valeur de la variable vers stdin. Ai-je raison?

cat >d.txt <<<$val fonctionnera cat >d.txt <<<$val tant que $val ne contient aucun espace. Sinon, l'utilisation de guillemets est nécessaire pour éviter que chaque mot dans $val ne soit traité comme un argument distinct.

Par exemple, si vous avez

 val="ab" cat >d.txt <<<$val 

ce que le shell tente de faire est

 cat >d.txt << 

Donc, seul le "a" est fourni en entrée et le "b" est juste un autre argument pour cat .

En utilisant des guillemets

 val="ab" cat >d.txt <<<"$val" 

maintenant le shell s'exécute

 cat >d.txt <<<"ab" 

donc la chaîne entière "ab" est traitée comme entrée.