IFS null 与未设置的 IFS 不一样?

IFS null 与未设置的 IFS 不一样?

我在这里读到了一个很好的问题,叫做了解 IFS。我很惊讶,因为答案和评论引用了 POSIX,其中指出 IFS= 与取消设置 IFS 不同。如果取消设置 IFS,显然会使用默认值。如果将 IFS 设置为空,则没有拆分器。我知道我对此有不同的看法,我在书签中发现了这一点:

Bourne Shell 编程

$IFS

脚本中的第一个语句应该是

IFS=

它将输入字段分隔符重置为其默认值。否则,您将从用户那里继承 $IFS,用户可能已将其设置为一些奇怪的值,以使 sh 解析字符串的方式与您期望的方式不同,并引发奇怪的行为。

那么,这是真的吗?还是作者只是错了?

答案1

您在 Stack Exchange 上找到的答案是正确的,而本教程是错误的。你可以自己尝试或者在网上查找标准。取消设置IFS相当于将其设置为 space-tab-newline 的默认值,而空则IFS有效地关闭字段拆分。

您可以咨询Sven Mascheck 在 IFS 上的页面关于历史实现。一些历史 shell 不喜欢unset IFS,并且非常旧的 ksh 版本将其视为空值,IFS但所有现代 shell 和大多数旧 shell 将 unsetIFS视为默认值。

IFS=除非您想关闭字段分割(这可能是一个合理的决定 - 但请注意,您仍然需要在替换周围加上双引号以避免通配符,除非您也将其关闭set -f),否则您不应该开始脚本。要重置默认值,请使用unset IFS。这在脚本的开头是否有用是有争议的。还有很多其他不好的事情,例如PATH调用者可能会做一些狡猾的事情来使您的脚本出错。

本教程还建议重置PATH。这通常是不好的建议。大多数情况下,您无法预测正确的搜索路径是什么,但用户知道。你怎么知道在一个古老的 UNIX 上是否/usr/local/bin包含/home/bob/bin错误修复版本的实用程序,而其中的实用程序/usr/bin有错误?您真的想嵌入所有逻辑来确定是否要放在/usr/xpg6/bin前面吗/bin?你想要什么位置/usr/gnu/bin?除非您的脚本针对特定系统,否则请勿重置 PATH。

我还没有读过本教程,但我确实检查了一件事:它并没有从一开始就告诉您始终在变量替换和命令替换周围加上双引号。所以我认为这个教程不是一个好的教程。

相关内容