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 读取循环。
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。
一种解决方案是设置别名,但是当它们与内置命令和系统二进制文件(例如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关键字并添加提示,提醒您正在做什么。