私は仕事用にいくつかの簡単なロギングツールを作成していますが、シェルにコマンドを入力したときに発生する小さな問題を解決しようとしています。関数の結果をインラインに保ちながら、他のコマンドの引数として使用することをできるだけスムーズにしたいと思います。たとえば、
sudo some-command --output "<my-function>_log.txt" <tab><tab> =>
sudo some-command --output "2021_project_a_log.txt"
特定のコマンドを書くときに私の機能を拡張(または実行)したいと思います。二重ラベルは単に理解を助けるためのものです。これは「インライン」という意味ですが、用語を誤って使用したものかもしれません。コマンドを分割したくありません。つまり、my-functionを実行して変数を保存するか、stdoutを使用してsome-commandと入力します。これらの機能は、デフォルトでプロジェクト名、タイムスタンプなどのメタデータを印刷します。これを使用して、さまざまなコマンドとツールの出力名を指定して保存します。
これまで私が見つけた方法は次のとおりです。
- 「`my-function`_log.txt」と書くことができます。
- 「$(my-function)_log.txt」と書くことができます。
その後、これら2つをそのまま使用するか(この場合は最初に確認できません)、ショートカットを使用して拡張できますが、Ctrl + Alt + E
解決shell-expand-line
する問題は次のとおりです。
- すべての機能(正常)とすべてのエイリアス(正常ではない)が拡張されます。
- 問題が発生する可能性がある文字列入力にこのタイプの拡張機能を使用するため、引用符は削除されました。
一部のエイリアスは長くて不要で、プロンプトが複雑になる可能性があるため、すべてのエイリアスを拡張したくありません。
質問:
Ctrl + Alt + E
のように選択した機能だけを拡張したり、カーソルの下の機能などを拡張する方法はありますか?または、特定のエイリアスの拡張をブロックできますか?
ありがとうございます!
答え1
3つのステップ:
sudo
メインプログラムの完全な機能(あなたのための)ファイルを定義します。_sudo_completions.env
#! /bin/bash _sudo_completions() { local SOME_COMMAND="echo" if [[ "${COMP_WORDS[1]}" == "${SOME_COMMAND}" ]]; then if [[ "${COMP_WORDS[2]}" == "--output" ]]; then if [[ "${COMP_WORDS[3]}" =~ ^\"[^\"]+_log.txt\"$ ]]; then CMD="${COMP_WORDS[3]%_log.txt\"}" CMD="${CMD#\"}" CMD_RESULT=$(${CMD}) COMPREPLY="\"${CMD_RESULT}_log.txt\"" fi fi fi } complete -F _sudo_completions sudo
もちろん、
SOME_COMMAND
"sudo
"サブコマンドを使用して""変数の値を変更することもできます。この古いファイルを読み込む
. _sudo_completions.env
.bash_profile
この行をファイルに入れることができますそれを書く!
sudo echo --output "my_fct_log.txt" <tab> <tab>