エスケープや引用なしで拡張シェルを閉じる方法はありますか?

エスケープや引用なしで拡張シェルを閉じる方法はありますか?

たとえば、zshコマンドの前にnoglob「ファイル名の生成をオフにする(ワイルドカード)」を付けることができます。

私は同様の方法を使用して、ワイルドカードだけでなくすべての種類の拡張機能を無効にできるシェルを探しています。理由:複雑なコマンドでバックスラッシュを使用または引用すると、A)読みやすく理解しにくく、B)他のネストレベルでの再利用には適していません。

ベストアンサー1

では、zsh次のことができます。

set -o interactive_comments -o extendedglob
alias '@=:;# '
handle_@() {
  local match
  if [[ $1 = (#b)@\##[[:space:]]##([^[:space:]]##)[[:space:]]#(*) ]] $match
}
preexec_functions+=(handle_@)

その後、コマンドの前に@ (完全編集バッファを設定する必要があります、no foo; @ cmdnorfoo | @ cmdなど)、その後の最初の単語はコマンド名として処理され、残りの行はコマンドに引数として渡されます。

$ @ echo asd'@123 # # qwe $x ``
asd'@123 # # qwe $x ``

これは、パラメータが空白で始まるか改行文字を含めることができないことを意味します。

これはエイリアス、noopコマンド(フックを実行するため)、およびコメントリーダーを使用して行われ、@残りの行はコメントとして解析され削除されます。:;#:preexec

preexecフックは未処理の行(in $1)をコマンドと引数に分割します。\##以前のバージョン(5.3以下)のバグはその部分で修正できます#。コメントが s に含まれていない 4.3.12 (2011 年から) 以下では動作しません。@zshprexec()$1

興味深いことに、zshにはquote-regionウィジェットもあります(デフォルトはquote-lineemacsモードでそれぞれAlt+"Alt+にバインドされています')。これにより、正しい引用を直接行う手間が省けます。

たとえば、次のようにできます。

$ perl -e Ctrl+Space$x = '何でも';...Alt+"

Ctrl+SpaceまたはCtrl+@(ターミナルは通常NUL文字を送信します)が設定されますエリア

On では、Alt+"次のように変換されます。

perl -e '$x = '\''whatever'\'';...'

そしてエリア今引用してみてください。また、見ることができますhttps://stackoverflow.com/q/5407916設定方法を学ぶエリア(選択)Shift+矢印/モーションキーを使用してください。

おすすめ記事