pythonbrew bashrc awk行不再有效

时间:2014-03-31 18:01:08

标签: python awk pythonbrew

我最近升级了我的FreeBSD盒子,现在pythonbrew似乎被打破了。它从这行上的.pythonbrew / etc / bashrc文件中解脱出来:

PATH_WITHOUT_PYTHONBREW=$(printf "$PATH" | awk -v RS=: -v ORS=: "/${PATH_ROOT//\//\/}/ {next} {print}" | sed -e 's#:$##')

给出错误:

awk: syntax error at source line 1
   context is
      >>> //home/myusername/. <<< pythonbrew/ {next} {print}
awk: bailing out at source line 1

PATH_ROOT变量是

/home/myusername/.pythonbrew

1 个答案:

答案 0 :(得分:4)

  1. 不要将变量放在printf格式参数中,因为当变量包含printf格式化字符时,变量会失败,例如: '%'。因此,请使用printf "%s" "$PATH"代替printf "$PATH"
  2. 使用双引号来分隔awk脚本永远不是一个好主意,因为它在脚本的其余部分引入了双引号地狱。因此,请使用'/'"${PATH_ROOT//\//\/}"'/{...}'代替"/${PATH_ROOT//\//\/}/{...}"
  3. 允许shell变量扩展动态地提供awk脚本的部分主体几乎绝不是一个好主意,因为它引入了奇怪的语法错误。因此,请使用awk -v path_root="${PATH_ROOT//\//\/}" '$0 ~ path_root{...}'代替'/'"${PATH_ROOT//\//\/}"'/{...}'
  4. 如果条件不存在,您可以测试条件的否定,而不是测试条件并使用next,然后使用打印件。
  5. 当将2个变量设置为相同的值(例如RS和ORS)时,最好将它们设置在一起而不是单独设置。
  6. 所以,总之,作为一个起点,你的脚本将是:

    PATH_WITHOUT_PYTHONBREW=$(printf "%s" "$PATH" |
        awk -v path_root="${PATH_ROOT//\//\/}" 'BEGIN{RS=ORS=":"} $0 !~ path_root' |
        sed -e 's#:$##')
    

    假设您的PATH_ROOT操作有意义。

    可以进一步改进,但这应该足以摆脱你的错误。