2

我最近升级了我的 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
4

1 回答 1

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 ,然后在条件不存在时使用 print ,您可以只测试条件的否定。
  5. 当将 2 个变量设置为相同的值(例如 RS 和 ORS)时,将它们设置在一起而不是单独设置是最清楚的。

因此,作为起点,您的脚本将是:

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

假设您的 PATH_ROOT 操作是有意义的。

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

于 2014-03-31T23:33:03.263 回答