«Echo $ IFS» не возвращает значение IFS

Я установил IFS в x , то есть IFS=x . Теперь, если я проверю значение IFS , тогда он кажется пустым, если я не использую двойные кавычки:

 ~ $ echo $IFS | cat -e $ ~ $ echo "$IFS" | cat -e x$ ~ $ echo $HOME /home/mar ~ $ echo "$HOME" /home/mar ~ $ 

Как видно выше, $HOME не ведет себя так. В чем причина такого поведения?

После того, как переменная расширяется, происходит разбиение слов, и оно разбивается на пустое слово (слова). Разделение выполняется с использованием каждого символа переменной IFS качестве разделителя, и поскольку $IFS только расширяется до символов в IFS он разбивается на пустое слово (ы).

Так, например:

 IFS=xxx; printf %q $IFS ''''''[root@localhost ~]# 

И если вы дважды цитируете, вы говорите bash, чтобы рассматривать все внутри кавычек как одно слово:

 printf %q "$IFS" xxx[root@localhost ~]# 

Я думаю, это связано с тем, что указано в Advanced Bash-Scripting Guide

Используйте двойные кавычки, чтобы предотвратить разделение слов. [2] Аргумент, заключенный в двойные кавычки, представляет собой одно слово, даже если он содержит разделители пробелов.

С примерами (5.1):

 var="'(]\\{}\$\"" echo $var # '(]\{}$" echo "$var" # '(]\{}$" Doesn't make a difference. IFS='\' echo $var # '(] {}$" \ converted to space. Why? echo "$var" # '(]\{}$"