【问题标题】:Why does this IFS variable assignment not affect the cmd it precedes? [duplicate]为什么这个 IFS 变量赋值不会影响它前面的 cmd? [复制]
【发布时间】:2019-09-29 17:43:30
【问题描述】:

考虑一下这个 bash 会话:

set -- 1 2 3
echo "$*"          # 1 2 3  (as expected)
IFS=a echo "$*"    # 1 2 3  (why not "1a2a3"?)
IFS=a; echo "$*"   # 1a2a3a (as expected)

Try it online!

为什么“命令前赋值”语法无法在单个命令期间将IFS 设置为不同的值?看来您必须先使用单独的命令更改 IFS 的值。

【问题讨论】:

标签: bash ifs


【解决方案1】:

因为IFS会影响命令的解析(分词、分词),所以必须在解析该命令之前设置。这就是为什么IFS=a echo "$*"只能使用原来的IFS,而不是a

这有点类似于FOO=bar echo $FOO 不回显bar 的情况。 $FOO 被替换(空),然后执行带有变量赋值的命令。

【讨论】:

  • 谢谢。所以为一个cmd重置它的唯一方法是保存旧值,设置为新值,执行cmd,然后设置回旧值,对吗?
  • @Jonah 正确,您会发现许多脚本在仅临时需要使用 IFS 时就可以做到这一点。
  • 要么就是这样,要么将其限定为子外壳,要么完全以不同的方式做事(printf -v outvar '%sa' "$@"; echo "${outvar%a}",f/e)。
  • @Jonah:拥有自己环境的子外壳可能会有所帮助:set -- 1 2 3; (IFS=a; echo "$*"); echo "$IFS"
  • 感谢@Cyrus,现在说得通了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 2023-03-09
  • 2019-12-25
  • 2015-02-28
  • 2020-06-08
  • 2021-02-04
相关资源
最近更新 更多