Bash 拡張動作

Bash 拡張動作

私はreadline関数shell-expand-linealias-expand-line.fromを扱っています。文書:

シェル拡張ラインシェルのように線を広げます。これは、エイリアスと履歴の拡張だけでなく、すべてのシェルワード拡張(シェル拡張ビュー)。

私が理解しているのは、shell-expand-linebashが実際の実行ポイントの前に実行するすべての置換と拡張を実行することです。

人為的な例がこれを支持しているようです。

$ NAME="Adam"
$ alias ec='echo'
$ ec $NAME

関数を実行すると、shell-expand-line前のコマンドが$ echo Adam

私の混乱は次の例から始まります。

$ alias cdspace='cd ~/path\ with\ spaces'
$ cdspace

shell-expand-line私の理解によると、コマンドを実行すると.$ cd /Users/Adam/path\ with\ spacesに拡張されますが、実際には期待どおりに機能しますが、実行して拡張すると$ cd ~/path with spaces失敗します。cdspacealias-expand-lineshell-expand-line

一部見積もりの​​削除~のシェル拡張問題を解決しました。

前の拡張の後、上記の拡張のいずれかで行われなかった引用符のない文字 '\'、 '''、および ''''はすべて削除されます。

したがって、引用されていないバックスラッシュは常に削除されているように見えます。これをテストするために手動で入力して$ cd ~/path\ with\ spaces実行すると、shell-expand-lineコマンドはに更新されます$ cd ~/path with spaces。また、入力して$ cd ~/path\\ with\\ spaces2shell-expand-line回実行すると、実行するたびにバックスラッシュセットが削除されます。

私の期待は、shell-expand-linebashの内部でその行を完全に拡張すると、最終的に問題が解決するということでしたが、何度も実行する必要があるためそうではありません。

私が今最終的に混乱している$ cd ~/path\ with\ spacesのはシェル拡張文書、最終的に解決されます$ cd ~/path with spaces

ベストアンサー1

ここでbashドキュメントが不明だと思います。他のコメントで指摘したように、shell-expand-line文書は次のことを意味します。みんなチルダ拡張が明らかに実行されない場合、シェル拡張が実行されます。

また、引用符を削除するステップでは、最初のパターン一致セットの後に残っている引用符のないバックスラッシュは削除されません。これは3.5.9(https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Quote-Removal)表現する。

つまり、私はshell-expand-lineその目的がシェルで実行できるコマンドを生成することだとは思わない(もしそれがあなたが期待しているなら)。すべてのシェル拡張を実行しているので、入力が次のようになるとします。すでにトークン化後のパターンマッチングステップでは、バックスラッシュを削除して、以前にエスケープされたスペースを「エスケープされていない」スペースにします。結果文字列を実行しようとするとトークン化されます。再びしたがって、スペースで区切られた各単語は別々のトークンとして扱われます。

おすすめ記事