我正在制作一些简单的日志工具用于工作,并且在 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 + E
来shell-expand-line
扩展它们,但这有以下我试图解决的问题:
- 所有函数(OK)和所有别名(不OK)均展开
- 引号被删除,因为我将使用这种类型的扩展进行字符串输入,这可能会破坏东西
我不想展开所有别名,因为其中一些别名可能很长且不必要,这会使提示混乱。
问题:
有没有办法扩展,例如 with Ctrl + Alt + E
,仅扩展所选函数或光标下的函数或其他内容?或者,我可以阻止某些别名的扩展吗?
谢谢!
答案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
”子命令更改“”变量的值。加载此先前文件
. _sudo_completions.env
您可以将此行放入您的
.bash_profile
文件中用它!
sudo echo --output "my_fct_log.txt" <tab> <tab>