
私はreadline関数shell-expand-line
とalias-expand-line
.fromを扱っています。文書:
シェル拡張ラインシェルのように線を広げます。これは、エイリアスと履歴の拡張だけでなく、すべてのシェルワード拡張(シェル拡張ビュー)。
私が理解しているのは、shell-expand-line
bashが実際の実行ポイントの前に実行するすべての置換と拡張を実行することです。
人為的な例がこれを支持しているようです。
$ 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
失敗します。cdspace
alias-expand-line
shell-expand-line
前の拡張の後、上記の拡張のいずれかで行われなかった引用符のない文字 '\'、 '''、および ''''はすべて削除されます。
したがって、引用されていないバックスラッシュは常に削除されているように見えます。これをテストするために手動で入力して$ cd ~/path\ with\ spaces
実行すると、shell-expand-line
コマンドはに更新されます$ cd ~/path with spaces
。また、入力して$ cd ~/path\\ with\\ spaces
2shell-expand-line
回実行すると、実行するたびにバックスラッシュセットが削除されます。
私の期待は、shell-expand-line
bashの内部でその行を完全に拡張すると、最終的に問題が解決するということでしたが、何度も実行する必要があるためそうではありません。
私が今最終的に混乱している$ 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
その目的がシェルで実行できるコマンドを生成することだとは思わない(もしそれがあなたが期待しているなら)。すべてのシェル拡張を実行しているので、入力が次のようになるとします。すでにトークン化後のパターンマッチングステップでは、バックスラッシュを削除して、以前にエスケープされたスペースを「エスケープされていない」スペースにします。結果文字列を実行しようとするとトークン化されます。再びしたがって、スペースで区切られた各単語は別々のトークンとして扱われます。