zsh:シェル制御文字を含むコマンドラインのみをエコーするエイリアスまたはシェル関数

zsh:シェル制御文字を含むコマンドラインのみをエコーするエイリアスまたはシェル関数

を使用して、zsh次のことを行うエイリアスまたはシェル関数を作成したいと思います。

<このエイリアスまたはシェル関数が、または、または、または>その他&のようなシェル制御文字に従わずにコマンドラインをエコーするようにしたいと思います。$"

つまり、提案された別名またはシェル関数の名前として "xxx"を使用する次の例を考えてみましょう。

xxx ls -Flastr "${something}" >/tmp/xyz &

>and&$and {and}と、"これらの特殊文字を尊重せずに実行せずに、以下を単純にエコーします。

ls -Flastr "${something}" >/tmp/xyz &

「xxx」の後にコマンドラインの残りの部分を引用し、特定の文字をエスケープすることでこれを行うことができることを知っていますが、追加の引用やエスケープなしでこれを達成する方法を探しています。

また、スクリプト全体ではなく、このエイリアスまたはシェル関数を介して呼び出された1行に対してのみ機能したいと思います。

これは可能ですzshか?

よろしくお願いします。

答え1

これを行う1つの方法は、で終わるエイリアスを作成し、残りの行をコメントアウトしてからレコードからその#行を抽出することです。コメントを有効にするために必要ですsetopt interactive_comments。しかし、印刷を開始する場所を知ることは難しいかもしれません。この単純なバージョンは、行全体を印刷します。

function xxx_function { print -lr -- ${history[$HISTCMD]}; }
alias xxx='xxx_function #'

答え2

これはStéphane Chazelasが提案したバリエーションであり、私にとって効果的でした。以下のStéphane Chazelasのコメントに基づいて、元の「回答」を修正しました。

set -o interactive_comments -o extendedglob
_donothing() {}
alias '@=_donothing # '
handle_@() {
  [[ "${2}" == _donothing ]] && {
    print -r - "${1}"
  }
  return 0
}
preexec_functions=(handle_@)

関連情報