Existe um atalho para executar um comando sugerido em um terminal?

5

Se eu digitar um comando para um programa que não está instalado, posso receber uma mensagem como esta:

[user]~$ program
The program 'program' is currently not installed.  You can install it by typing:
sudo apt-get install program
[user]~$ 

Existe um atalho ou comando de teclado que eu possa digitar que será executado sudo apt-get install programsem que eu precise digitá-lo eu mesmo?

Nick Brunt
fonte

Respostas:

3

Crie um alias conforme apropriado para seu shell. Em bash, adicione esta linha a ~/.bashrc:

alias sagi="sudo apt-get install"

Em seguida, source ~/.bashrcexecute aliase verifique se o alias aparece na sua lista. Depois disso, basta digitar

sagi <package>

para invocar o alias. Para outras shells, o formato do comando alias e o nome do arquivo rc serão diferentes, mas o sourcee aliasdeve ser o mesmo.

dafydd
fonte
Parece uma solução simples e eficaz, saúde!
Nick Brunt
3

ATUALIZAÇÃO: Agora ele tentará instalar / bin / program , / usr / bin / program , / sbin / program ou / usr / sbin / program .
Isso é totalmente automático ...
Digamos que você digite g++ main.cppe não possui o g ++ instalado, ele perguntará se você deseja instalar o pacote g ++ e, se você responder sim, ele o instalará e será executado g++ main.cpp.

(Esta é uma configuração única ... Faça isso e você estará pronto)

  1. Instale o arquivo apt ... sudo apt-get install apt-file
  2. Atualize seu cache ... sudo apt-file update
  3. Edite ~ / .bashrc e adicione-o:

    command_not_found_handle () {
    ask () {
      echo -ne "$1 (Y/n) ";
      read -N1 YES_ANSWER;
      echo "";
      YES_ANSWER=`echo $YES_ANSWER | sed 's/Y/y/; s/N/n/;'`;
      if [ "x$YES_ANSWER" == "xy" ]; then
        unset YES_ANSWER;
        return 0;
      elif [ "x$YES_ANSWER" == "xn" ]; then
        unset YES_ANSWER;
        return 1;
      elif [ "x$YES_ANSWER" == "x" ]; then
        unset YES_ANSWER;
        return 0;
      else
        ask_yes "$1";
        unset YES_ANSWER;
        return $?;
      fi;
    }
    if [ "x$1" == "x" ]; then
      echo "File name not provided.";
      return 1;
    fi;
    echo "Command not found: $1";
    echo "Searching for file in database...";
    FILE="`apt-file search /bin/$1 | sed 's/: /_/'`";
    if [ "x$FILE" != "x" ]; then
      FILE="`apt-file search /usr/bin/$1 | sed 's/: /_/'`";
    fi;
    if [ "x$FILE" != "x" ]; then
      FILE="`apt-file search /sbin/$1 | sed 's/: /_/'`";
    fi;
    if [ "x$FILE" != "x" ]; then
      FILE="`apt-file search /usr/sbin/$1 | sed 's/: /_/'`";
    fi;
    if [ "x$FILE" != "x" ]; then
      for f in "$FILE"; do
        if ask "\nDo you want to install package `echo $f | sed 's/_.*$//'` which provides `echo $f | sed 's/^.*_//'`?"; then
          sudo apt-get install `echo $f | sed 's/_.*$//'`;
          "$@";
          return $?;
        fi;
      done;
    else
      echo "Could not find file $1.";
      return 1;
    fi;
    }
    

Ainda estou testando isso, mas no teste preliminar parece funcionar. De vez em quando, seria bom executar apt-file updatea atualização da lista de arquivos disponíveis.

Para tornar o ~ / .bashrc editado efetivo, siga um destes procedimentos: efetue logout e logon novamente ou execute . ~/.bashrc.

BenjiWiebe
fonte
O Yum está disponível apenas para Linux baseado em RPM .
Dafydd 29/10/12
@dafydd eu percebo isso. Eu só estava desejando que eles tivessem yum, por causa de yum provides. Isso tornaria as coisas mais fáceis.
BenjiWiebe
Se alguém vir algo errado com o comando acima, deixe um comentário aqui dizendo o que está errado. Eu acabei de escrever o que foi mencionado há alguns minutos atrás ... Corrigido cerca de 4 bugs já ... Provavelmente há mais ainda ... :(
BenjiWiebe 29/12
+1 para a idéia de substituir o command_not_found_handlemanipulador.
Zoredache
@ Zoredache A idéia vem do Fedora ... Mas eu não gostei, então descobri o que estava acontecendo e o desabilitei. Agora esse conhecimento foi útil para escrever um novo código para o Debian fazer a mesma coisa.
BenjiWiebe
2

Se você estiver em um terminal gráfico, clique três vezes na linha que começa com sudo apt-getpara marcá-lo completamente e, em seguida, clique com o botão do meio para colá-lo no terminal. Como alternativa, a julgar pela saída, digite algo como

# $(program | tail -n 1)

para executar a saída do tail -n 1comando depois de receber a saída de program. Provavelmente não é mais curto. Entretanto, teoricamente, isso deve permitir a definição de um alias como o seguinte

# alias ii='$( $(history -p !!) | tail -n 1)'

que deve pegar o último comando do histórico, executá-lo, obter sua última linha e executá-lo novamente. Infelizmente, isso não funciona. Isso discute um problema semelhante, mas eu não consegui adaptá-lo a este, o bash geralmente reclama que não encontrou "".

Cláudio
fonte