IFS null是否与未设置IFS相同?


13

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

Bourne Shell编程

$ IFS

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

IFS =

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

那么前段时间是真的还是作者错了?

Answers:


20

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

您可以查阅IFS上Sven Mascheck的页面上有关历史实现的信息。一些历史上的shell不喜欢它unset IFS,而ksh的一个很旧的版本将其视为空,IFS但是所有现代的shell和大多数旧的shell都将unset视为IFS默认值。

IFS=除非要关闭字段拆分,否则不应该使用脚本开始(这可能是一个合理的决定,但是请注意,除非您也将其关闭,否则您仍需要在替换内容前后加上双引号,以免产生乱码set -f)。要重置默认值,请使用unset IFS。在脚本开始时是否有用还存在争议。还有很多其他不好的事情,例如PATH调用程序可以使您的脚本出错的躲避程序。

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

我还没有阅读本教程,但是我确实检查了一件事:它从一开始就没有告诉您总是将双引号放在变量替换和命令替换周围。因此,我认为本教程不是一个很好的教程。


unset IFS尽管会重置字段拆分,但不会将bfash中的IFS重置为其默认值。
Melab

@Melab unset IFS不会重置IFS为其默认值,而是将其取消设置。但是未设置IFS的效果与IFS设置为默认值的效果相同。
吉尔(Gilles)'“ SO-别再作恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.