您可以扩展(执行)与 bash 内联的函数以将结果用于另一个命令的参数吗?

您可以扩展(执行)与 bash 内联的函数以将结果用于另一个命令的参数吗?

我正在制作一些简单的日志工具用于工作,并且在 shell 中键入命令时我试图解决一个小问题。我想尽可能顺利地使用函数的结果作为另一个命令的参数,同时保持其内联。例如:

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”

然后,这两个可以按原样使用(在这种情况下我无法先检查它们),或者我可以使用快捷方式Ctrl + Alt + Eshell-expand-line扩展它们,但这有以下我试图解决的问题:

  • 所有函数(OK)和所有别名(不OK)均展开
  • 引号被删除,因为我将使用这种类型的扩展进行字符串输入,这可能会破坏东西

我不想展开所有别名,因为其中一些别名可能很长且不必要,这会使提示混乱。

问题:

有没有办法扩展,例如 with Ctrl + Alt + E,仅扩展所选函数或光标下的函数或其他内容?或者,我可以阻止某些别名的扩展吗?

谢谢!

答案1

三个步骤:

  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>
    

相关内容