Como posso prefixar todos os comandos em um shell sem digitá-lo toda vez?
Meu caso de uso 1:
$ git init
$ git add -A
$ git commit
$ git push
O prefixo deve ser git␣
( ␣
é o caractere de espaço)
init
add -A
commit
push
Meu caso de uso 2:
sudo docker run my-repo/my-image
sudo docker ps
sudo docker images
O prefixo deve sersudo docker␣
run my-repo/my-image
ps
images
Seria melhor se eu pudesse fazer algo assim:
$ git init
$ use_prefix sudo docker
> ps
> images
> exit
$ sudo docker run my-repo/my-image
Você poderia usar uma função como a seguinte:
Isso aceitará seu prefixo como argumentos para o
use_prefix
comando e, em seguida, lerá de stdin para cada comando a ser prefixado.Nota: Você terá que usar ctrl+c para sair do loop while read.
Você poderia usar
xargs
, mas com a devida atenção às ressalvas associadas ao seu usoem seguida, digite
init
,add -A
etc, um por linhaCom o
zsh
shell, você pode executar:Para que o conteúdo de
$zle_prefix
seja inserido no início do buffer quando você começar a inserir uma nova linha de comando.Então você pode fazer:
Para que
sudo docker
seja inserido no início dos comandos subsequentes.Você pode definir outro widget que prime
$zle_prefix
com o que está atualmente antes do seu cursor:E então você pode digitar
Então
sudo docker
será inserido para todos os comandos subsequentes. Quando terminar, apague a linha ( Ctrl+U) e digite Alt+Shift+Pnovamente para esvaziar$zle_prefix
.Uma solução seria configurar aliases, mas você terá que estar atento quando eles colidirem com comandos internos e binários do sistema (por exemplo
ps
).No seu
~/.bashrc
adicione algumas linhas assim (entra em vigor quando você iniciar o bash ou digitarsource ~/.bashrc
):Para executar um real
ps
, você teria que digitarcommand ps
ou\ps
. Isso geralmente afetaria apenas a digitação na linha de comando, a menos que você disponibilize especificamente os aliases para scripts.Quanto a uma interface de shell interativa como você sugere, isso exigiria algo mais envolvido.
A saber, uma expansão da boa sugestão de @Jesse_B:
Ativando a
exit
palavra-chave e também adicionando um prompt lembrando o que você está fazendo.Olá e bem-vindo ao site!
uma possível solução para isso é usar
aliasing
embora não negue o "prefixo", pode economizar muito no tempo
por exemplo
OU
se houver várias palavras, use aspas
você precisará redefinir esses aliases a cada sessão, no entanto
Você essencialmente quer um sub-shell de uso geral para o comando específico:
Então:
Qualquer comando que você digitar é prefixado pelo comando original (absoluto ou relativo, além de quaisquer argumentos). O prompt lembra em qual comando original você está. Você pode
exit
sair inteiramente ouescape
um comando.Você pode criar o alias no arquivo .bashrc do Linux: alias init="git init"
e quando você executa o comando init do terminal automaticamente o comando "git init" seria invocado.
Supondo que você use o bash, existem muitas maneiras de fazer isso, conforme mencionado acima. Aqui está o que achei mais conveniente - YMMV:
~/.bash_aliases
.bash_profile
.Observe que, estritamente falando, o arquivo não contém aliases, mas estou usando esse nome para manter as coisas organizadas. Você pode querer chamá-lo de .bash_functions.
Aqui está um exemplo extremamente simples para você começar. Ele não verifica se você realmente passou um argumento ou não.
Você pode então adicionar uma linha em sua
.bash_profile
fonte assim:. ~/.bash_aliases
Aqui estão alguns exemplos de uso:
Observe que você pode usar $1 no lugar de $@, mas isso levará apenas um argumento em vez de considerar tudo o que foi passado para a função.
HTH.