私は今日他の2つの質問で偶然この現象を発見した後、この現象を詳しく見ました。私は基本的にこれをすべて試しましたset -H
(記録拡張がオンになっています)。
スクリプトをテストするために複数行の文字列を入力し、スクリプトを介してパイピングするなどの操作を頻繁に実行しますが、echo
場合によってはエラーが発生します。
$ echo "foo
bar" | sed '/foo/!d'
bash: !d': event not found
>
!
一重引用符で囲まれているにもかかわらず、レコード拡張を引き起こすようです。問題は、同じ行に二重引用符があることです。
$echo $'foo\nbar' | sed '/foo/!d'
効果もとても良いです。
$echo "foo
bar" |
> sed '/foo/!d'
私の疑い:履歴拡張は1行ずつ適用されるため、次'
のシングルは"
エスケープされたと見なされるため、次は!
エスケープされません。
今私の質問はこれがバグですか、それとも予想される動作ですか?複製されたbash
バージョンは4.2.30と4.4.12です。
ベストアンサー1
に報告[email protected]
してもらいました。回答:
歴史の拡張は明らかにルート指向であり、常にそうでした。シェルの現在の参照状態を知る明確な方法はありません(主にシェル独立ライブラリであるため)。おそらく、既存のコールバック関数の1つを使用してこれを行う方法があります。
私にとっては、この言葉は」現在の実装ではより良い結果が得られないため、これはバグではありません。」。
修正する
仕事を変えた後、私はそのトピックに興味を失いましたzsh
。これでバージョン5.1.4を試してみましたが、bash
問題がもう再現されないことがわかりました。したがって、4.4.12と5.1.4の間で誰かがこの問題を解決しました。