bashを使用して関数をインラインに拡張(実行)して、結果を他のコマンドの引数として使用できますか?

bashを使用して関数をインラインに拡張(実行)して、結果を他のコマンドの引数として使用できますか?

私は仕事用にいくつかの簡単なロギングツールを作成していますが、シェルにコマンドを入力したときに発生する小さな問題を解決しようとしています。関数の結果をインラインに保ちながら、他のコマンドの引数として使用することをできるだけスムーズにしたいと思います。たとえば、

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つのステップ:

  1. 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"サブコマンドを使用して""変数の値を変更することもできます。

  2. この古いファイルを読み込む

    . _sudo_completions.env
    

    .bash_profileこの行をファイルに入れることができます

  3. それを書く!

    sudo echo --output "my_fct_log.txt" <tab> <tab>
    

関連情報