たとえば、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; @ cmd
norfoo | @ cmd
など)、その後の最初の単語はコマンド名として処理され、残りの行はコマンドに引数として渡されます。
$ @ echo asd'@123 # # qwe $x ``
asd'@123 # # qwe $x ``
これは、パラメータが空白で始まるか改行文字を含めることができないことを意味します。
これはエイリアス、noopコマンド(フックを実行するため)、およびコメントリーダーを使用して行われ、@
残りの行はコメントとして解析され削除されます。:;#
:
preexec
preexec
フックは未処理の行(in $1
)をコマンドと引数に分割します。\##
以前のバージョン(5.3以下)のバグはその部分で修正できます#
。コメントが s に含まれていない 4.3.12 (2011 年から) 以下では動作しません。@
zsh
prexec()
$1
興味深いことに、zshにはquote-region
ウィジェットもあります(デフォルトはquote-line
emacsモードでそれぞれAlt+"とAlt+にバインドされています')。これにより、正しい引用を直接行う手間が省けます。
たとえば、次のようにできます。
$ perl -e Ctrl+Space$x = '何でも';...Alt+"
Ctrl+SpaceまたはCtrl+@(ターミナルは通常NUL文字を送信します)が設定されますエリア。
On では、Alt+"次のように変換されます。
perl -e '$x = '\''whatever'\'';...'
そしてエリア今引用してみてください。また、見ることができますhttps://stackoverflow.com/q/5407916設定方法を学ぶエリア(選択)Shift+矢印/モーションキーを使用してください。