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. 奇妙な構文エラーが発生する可能性があるため、シェル変数の展開によって 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 に答える