关于 Bourne shell 和派生程序,我理解IFS
它是一个用于字段拆分的行为程序(命令如何将字段拆分为“单词”),这是名为“解析”的更广泛过程所需的。
我读过如果IFS
(作为环境变量)未设置(与 一样unset IFS
),则 shell应表现得好像IFS 的值为<space>
、<tab>
和<newline>
。
暂时把可能的严重后果放在一边,直觉上我认为取消设置一个环境变量会在没有警告的情况下删除它,类似于如何在rm -rf /*
没有警告的情况下摧毁一个系统,以及类似于发生的情况unset xyz
(如取消设置一个人为创建的非环境变量,然后被删除)。
所以,我想说这unset IFS
并不是真正取消它,而是将它(在其他地方)重置为某种默认的后备行为。
取消设置环境变量是否总是会导致一些后备行为?
答案1
这不是bash
特定的,但适用于所有实现 POSIX 行为的 shell。
取消设置IFS
将unset IFS
取消设置该变量。它不会神奇地获得另一个值。
POSIX 标准明确指出
如果
IFS
未设置,则对于未设置的变量,它的行为应正常[...]
它接着说,当 shell 想要进行字段分割(分割不带引号的值、分割read
输入,以及分隔"$*"
字符串中的位置参数时),并且当IFS
未设置 时,它应该表现仿佛该IFS
变量的值包括空格、制表符和换行符。
这与说实用程序(在本例中为 shell)将使用变量(如果可用)没有什么不同,否则具有一些定义良好的默认行为。
另请注意,它IFS
不是也不应该是环境变量。即,它永远不需要导出。它仅由当前 shell 及其内置read
实用程序使用。 shellIFS
在启动时将设置为空格、制表符和换行符。
另请参阅特殊部分外壳变量在 POSIX 标准中。