有时,在编写脚本时,可能需要将IFS
(内部字段分隔符)设置为默认值以外的其他值,例如更改$*
扩展方式。
虽然这是完全合理的,但我想不出任何理由IFS
在交互式 shell 中将其设置为默认值(如果我没记错的话,即空格、制表符和换行符)。尽管如此,我还是经常被告知,在交互式 shell 上,我不能期望IFS
将其设置为默认值。
这是真的吗?谁能举出实际例子吗?
答案1
在交互式 shell 中,$IFS
将是默认值,除非您更改了它或 shell 启动脚本中的某些内容(例如~/.bashrc
for bash
)或自 shell 启动以来执行的任何其他脚本或执行的 shell 函数更改了它(他们通常不会或会将其更改回来)如果正确编写的话,则为默认值)。
如果这些函数定义在RC文件或其他来源文件已正确编写,并且需要使用分词,它们不会对 IFS 的当前值进行任何假设,因此您将其设置为不同的值应该没问题。
但是,一旦更改它,您必须记住您所做的,因为这可能会影响稍后运行的命令行的解释方式。
例如,如果您这样做:
IFS=:; ls -- $PATH
要列出 中的目录$PATH
,您可能想知道为什么稍后会出现以下情况:
rm -f -- $(cat ~/my.file.list)
不要再工作了。所以你不妨这样写:
(IFS=:; ls -- $PATH)
或者:
IFS=:; ls -- $PATH; unset IFS
(顺便说一句,unset IFS
将分词恢复为其默认行为,但不是,它破坏了执行诸如恢复之$IFS
类的操作的(未正确编写的)函数)。oldIFS=$IFS; IFS=xxx; ...; IFS=$oldIFS
$IFS
答案2
当然,您可以而且应该期望将其IFS
设置为默认值,因为如果没有它,各种命令将完全停止工作。
当您碰巧需要它时(很少发生),您可以在 shell 中(暂时)更改 IFS,其原因与您在 bash 脚本中进行更改的原因相同。如果您只想使用某个特定命令一次,则没有理由将其写入 shell 脚本。除此之外,shell 脚本和直接使用 shell 没有区别。