AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 555622
Accepted
iybkyqjpbEP
iybkyqjpbEP
Asked: 2019-12-05 10:52:39 +0800 CST2019-12-05 10:52:39 +0800 CST 2019-12-05 10:52:39 +0800 CST

Prefixar todos os comandos no shell

  • 772

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
bash shell
  • 8 8 respostas
  • 7491 Views

8 respostas

  • Voted
  1. Best Answer
    jesse_b
    2019-12-05T11:19:15+08:002019-12-05T11:19:15+08:00

    Você poderia usar uma função como a seguinte:

    use_prefix () {
        while read -ra c; do
            "$@" "${c[@]}"
        done
    }
    

    Isso aceitará seu prefixo como argumentos para o use_prefixcomando 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.

    • 17
  2. iruvar
    2019-12-05T11:39:57+08:002019-12-05T11:39:57+08:00

    Você poderia usar xargs, mas com a devida atenção às ressalvas associadas ao seu uso

    xargs -L1 git
    

    em seguida, digite init, add -Aetc, um por linha

    • 13
  3. Stéphane Chazelas
    2019-12-06T04:26:14+08:002019-12-06T04:26:14+08:00

    Com o zshshell, você pode executar:

    zle-line-init() if [[ $CONTEXT = start ]] LBUFFER=$zle_prefix$LBUFFER
    zle -N zle-line-init
    

    Para que o conteúdo de $zle_prefixseja inserido no início do buffer quando você começar a inserir uma nova linha de comando.

    Então você pode fazer:

    zle_prefix='sudo docker '
    

    Para que sudo dockerseja 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:

    prime-zle-prefix() zle_prefix=$LBUFFER
    zle -N prime-zle-prefix
    bindkey '\eP' prime-zle-prefix
    

    E então você pode digitar

    $ sudo docker Alt+Shift+Pls

    Então sudo dockerserá inserido para todos os comandos subsequentes. Quando terminar, apague a linha ( Ctrl+U) e digite Alt+Shift+Pnovamente para esvaziar $zle_prefix.

    • 10
  4. bxm
    2019-12-05T11:07:10+08:002019-12-05T11:07:10+08:00

    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 ~/.bashrcadicione algumas linhas assim (entra em vigor quando você iniciar o bash ou digitar source ~/.bashrc):

    alias commit='git commit'
    alias docker='sudo docker'
    alias images='docker images'
    alias ps='docker ps'
    

    Para executar um real ps, você teria que digitar command psou \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:

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

    Ativando a exitpalavra-chave e também adicionando um prompt lembrando o que você está fazendo.

    • 8
  5. CyberStems
    2019-12-05T11:10:49+08:002019-12-05T11:10:49+08:00

    Olá e bem-vindo ao site!

    uma possível solução para isso é usaraliasing

    embora não negue o "prefixo", pode economizar muito no tempo

    por exemplo

    alias g=git
    
    $ g init
    $ g add -A
    $ g commit
    $ g push
    

    OU

    se houver várias palavras, use aspas

    alias sd="sudo docker"
    
    sd run my-repo/my-image
    sd ps
    sd images
    

    você precisará redefinir esses aliases a cada sessão, no entanto

    • 4
  6. bishop
    2019-12-07T08:41:18+08:002019-12-07T08:41:18+08:00

    Você essencialmente quer um sub-shell de uso geral para o comando específico:

    shell() {
        TOPCMD=$@ bash -c 'while read -p "${TOPCMD##*/}> " -ra sub; do
            case ${sub[0]:-} in
            "") continue;;
            exit) exit;;
            escape) (set -x; ${sub[@]:1});;
            *) (set -x; ${TOPCMD} ${sub[@]});;
            esac
            done'
    }
    

    Então:

    $ shell git -p
    git -p> init
    + git -p init
    Initialized Git repository in /path/to/.git/
    git -p> escape touch foo
    + touch foo
    git -p> add .
    + git -p add .
    git -p> status
    + git -p status
    On branch master
    
    No commits yet
    
    Changes to be committed:
      (use "git rm --cached <file>..." to unstage)
    
            new file:   foo
    
    git -p> 
    

    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 exitsair inteiramente ou escapeum comando.

    • 3
  7. Nikita Bakshi
    2019-12-06T22:56:54+08:002019-12-06T22:56:54+08:00

    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.

    • 0
  8. Hopping Bunny
    2019-12-11T21:33:29+08:002019-12-11T21:33:29+08:00

    Supondo que você use o bash, existem muitas maneiras de fazer isso, conforme mencionado acima. Aqui está o que achei mais conveniente - YMMV:

    1. Crie uma função para cada "atalho" que você deseja usar.
    2. Tenha todas essas funções em um arquivo chamado, digamos,~/.bash_aliases
    3. Fonte este arquivo em seu .bash_profile.
    4. Chame a função seguida pelo(s) argumento(s).

    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.

    $ cat ~/.bash_aliases
    
    g() {
     git "$@"
    }
    
    sudock() {
     sudo docker "$@"
    }
    
    

    Você pode então adicionar uma linha em sua .bash_profilefonte assim:

    . ~/.bash_aliases

    Aqui estão alguns exemplos de uso:

    g status
    g commit -m 'initial commit' fileName
    sudock run my-repo/my-image
    

    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.

    • 0

relate perguntas

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • Como salvar um caminho com ~ em uma variável?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve