在shell脚本中执行“export VAR = value”是否可移植?

时间:2016-11-16 18:54:23

标签: shell unix posix

我看到很多片段:

SOME_LONG_VARIABLE_NAME=whatever_value
export SOME_LONG_VARIABLE_NAME

我想知道为什么人们不这样做:

export SOME_LONG_VARIABLE_NAME=whatever_value

我的问题:

  1. 是否需要支持符合POSIX的shell来支持export VAR=value语法?即,它是便携式的吗?
  2. 如果是这样,为什么这个较短的语法不普遍?

3 个答案:

答案 0 :(得分:1)

如前所述,POSIX requires支持语法:

export name[=word]...

当然,非POSIX shell可能会在此语法上失败,但这超出了 这个问题的范围。以上语法是可移植的。

答案 1 :(得分:1)

“便携式”与“是POSIX”的问题不完全相同。 export var=value由POSIX指定,但如果您定位更广泛的所有(当前和旧版)Bourne类shell,则它不可移植。

我不知道供应商目前是否有任何不允许使用此语法的系统。但同样,“目前正在销售的系统”和“目前正在运行的系统”是不同的问题。我们需要一些AIX,HP-UX,Solaris等的实际用户来停下来告诉我们......

您可以通过以下任何原因找到使用两步“分配然后导出”的脚本:

  1. 该脚本很久以前就已经写好了,从那以后一直处于维护模式。结合这些陈述将是一种纯粹的美化改变,这是不可取的。
  2. 该脚本实际上是在具有非POSIX /bin/sh
  3. 的某些遗留系统上运行
  4. 作者很久以前就学习了shell编程,只是习惯性地做了一些事情,因为他们知道旧的方法(当与POSIX没有矛盾时)至少和POSIX一样便携。也可以使用expr来查看此类人员的算术,并且可能会出现神秘的构造${1+"$@"}
  5. (最糟糕的情况)作者在不理解其他脚本的情况下复制了其他脚本的碎片,这篇文章来自之前类别中的一个脚本。

答案 2 :(得分:0)

这不是答案,但我想提一下我刚刚发现的以下问题。

以下代码段在bash中的行为与在dash中的行为不同:

names="one two three"
export BOBO=$names
  1. 在bash中,变量BOBO将按预期包含“一二三”。
  2. 在破折号中,变量BOBO将包含“one”。换句话说:在dash中,“export”就像一个系统命令(如lsecho,...),在命令看到它之前执行变量扩展。破折号中的命令实际上是export BOBO=one two three
  3. (要使短划线像bash一样,我们需要在引号中写"$names"。或者首先不要使用export var=val syntax。)

    [{1}} 存在同样的问题(不在POSIX中,顺便说一下):如果你想让破折号将其作为句柄处理,你需要将local var=$val括在引号中预期

    考虑到流行系统中的$val(如Ubuntu)实际上是破折号,这是一个巨大的问题。 (我想知道为什么我没有听说过它!)

    编辑:

    我看到"Are quotes needed for local variable assignment?"中讨论了这个问题。