在 shell 中为所有命令添加前缀

iyb*_*bEP 21 command-line shell bash

如何在不每次都键入的情况下为 shell 中的所有命令添加前缀?

我的用例1:

$ git init
$ git add -A
$ git commit
$ git push
Run Code Online (Sandbox Code Playgroud)

前缀应该是git??是空格字符)

init
add -A
commit
push
Run Code Online (Sandbox Code Playgroud)

我的用例2:

sudo docker run my-repo/my-image
sudo docker ps
sudo docker images
Run Code Online (Sandbox Code Playgroud)

前缀应该是 sudo docker?

run my-repo/my-image
ps
images
Run Code Online (Sandbox Code Playgroud)

如果我能做这样的事情,那就最好了:

$ git init
$ use_prefix sudo docker
> ps
> images
> exit
$ sudo docker run my-repo/my-image
Run Code Online (Sandbox Code Playgroud)

jes*_*e_b 16

您可以使用如下函数:

use_prefix () {
    while read -ra c; do
        "$@" "${c[@]}"
    done
}
Run Code Online (Sandbox Code Playgroud)

这将接受您的前缀作为use_prefix命令的参数,然后从标准输入读取每个要添加前缀的命令。

注意:您必须使用 ctrl+c 退出 while 读取循环。

  • 这种方法的一个缺点是在循环中输入的命令不会保存到您的命令行历史记录中。(只是说,虽然这个方法没有错。) (6认同)
  • 您可以在运行命令后添加类似 `history -s "$@" "${c[@]}"` 的内容以手动将它们放入历史记录中 (3认同)

iru*_*var 13

您可以使用xargs,但要适当注意与其使用相关的注意事项

xargs -L1 git
Run Code Online (Sandbox Code Playgroud)

然后输入initadd -A等等,每行一个


Sté*_*las 10

使用zsh外壳,您可以运行:

zle-line-init() if [[ $CONTEXT = start ]] LBUFFER=$zle_prefix$LBUFFER
zle -N zle-line-init
Run Code Online (Sandbox Code Playgroud)

$zle_prefix当您开始输入新的命令行时,要在缓冲区的开头插入的内容。

所以你可以这样做:

zle_prefix='sudo docker '
Run Code Online (Sandbox Code Playgroud)

为了sudo docker将其插入到后续命令的开头。

你可以定义另一个小部件的素数 $zle_prefix与当前光标之前什么:

prime-zle-prefix() zle_prefix=$LBUFFER
zle -N prime-zle-prefix
bindkey '\eP' prime-zle-prefix
Run Code Online (Sandbox Code Playgroud)

然后你可以输入

$ sudo docker Alt+Shift+Pls

然后sudo docker将为所有后续命令插入。完成后,将行 ( Ctrl+U)Alt+Shift+P清空并再次输入empty $zle_prefix


bxm*_*bxm 8

一种解决方案是设置别名,但是当它们与内置命令和系统二进制文件(例如ps)发生冲突时,您必须注意。

在您~/.bashrc添加一些这样的行(在您下次启动 bash 或输入时生效source ~/.bashrc):

alias commit='git commit'
alias docker='sudo docker'
alias images='docker images'
alias ps='docker ps'
Run Code Online (Sandbox Code Playgroud)

要运行实际,ps您必须键入command ps\ps。这通常只会影响在命令行中的输入,除非您专门为脚本提供别名。

至于像您建议的交互式 shell 界面,那将需要更多的东西。

也就是说,@Jesse_B 的好建议的扩展:

use_prefix () {
    while read -p "$* >" -ra c; do
        [ "${c[0]}" = "exit" ] && break
        "$@" "${c[@]}"
    done
}
Run Code Online (Sandbox Code Playgroud)

启用exit关键字并添加提示,提醒您正在做什么。

  • 你可以转义别名:`\ps` - 比 `command ps` 快一点。 (3认同)
  • 我认为别名是最好的解决方案,但相反,我建议使用简短和通用的别名:例如,g=git; sd = 须藤泊坞窗。通常,为子命令创建别名并不好,除非您几乎总是这样使用它们或者它们太长而难以记住,否则您最终会得到太多别名,从而导致不使用它们(并忘记如何在其他没有您的配置的系统) (2认同)