在 bash: one-liner 模板中更快编码

faster coding in bash: one-liner templates

使用 bash 通常很乏味,尤其是因为经常会有一些开销。 我想用某种宏加快我的 bash 编码速度,因为我不是最快的打字员。

一个用例是将 a.out 复制到某些(子)目录:

mkdir subdir{1..5}
echo "123" > a.out
for d in $(ls -d subdir*); do cd $d; pwd; cp ../a.out .; cd ..;done

我重复使用 body

for d in $(ls $PATTERN); do $COMMAND ;done

在更广泛的背景下有一些 $COMMAND。一种加速选项是 bash 函数。

function loop () {
  for d in $(ls ); do  ;done
}

但是由于bash有一个auto-completion机制,还有很棒的ctrl+r搜索,我想知道是否有一个聪明的技巧利用这个机制让body出现直接在 bash 提示符下。理想的情况是在 bash 中键入一些预定义的关键字,例如 loop,然后按 TAB(或其他一些快捷键)body

for d in $(ls $PATTERN); do $COMMAND ;done

出现在bash中(并且仍然可以被操纵)。

为了弄清楚我在想什么:这是像 vscode 这样的编辑器的标准功能,我可以在其中键入 func,出现一个下拉菜单,我可以 select 一些 body 得到 function ### (###) {###} 写出来。 这样的宏肯定也会在其他情况下帮助我,每当我必须多次使用相同的 body 时。

有什么想法吗? 如何处理bash中提到的开销?

正在为 for 关键字定义完成函数?

#!/bin/bash

_for() {
    COMPREPLY=()
    if [[ ${#COMP_WORDS[@]} == 2 ]]
    then
        COMPREPLY=( 'd in PATTERN; do COMMAND; done' )
    fi
}

complete -F _for for

然后尝试输入:for Tab