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 de teclado ou um comando que eu possa digitar que executará sudo apt-get install program sem que eu tenha que digitá-lo eu mesmo?

    
por Nick Brunt 29.10.2012 / 18:44

3 respostas

3

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

alias sagi="sudo apt-get install"

Em seguida, source ~/.bashrc e execute alias para verificar se o alias aparece na sua lista. Depois disso, basta digitar

sagi <package>

para invocar o alias. Para outros shells, o formato do comando alias e o nome do arquivo rc serão diferentes, mas source e alias devem ser os mesmos.

    
por 29.10.2012 / 19:12
3

UPDATE: Agora ele tentará instalar o / bin / programa , / usr / bin / programa , / sbin / programa , ou / usr / sbin / programa .
Isto é totalmente automático ...
Digamos que você digite g++ main.cpp e você não tenha o g ++ instalado, ele perguntará se você deseja instalar o pacote g ++, e se você responder sim, ele irá instalá-lo e então executar g++ main.cpp .

(Esta é uma configuração única ... Faça isso e você é bom para ir)

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

    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 update para atualizar a lista de arquivos disponíveis.

Para tornar o ~ / .bashrc editado em vigor, siga um destes procedimentos: sair e entrar novamente, ou execute . ~/.bashrc .

    
por 29.10.2012 / 19:17
2

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

# $(program | tail -n 1)

para executar a saída do comando tail -n 1 depois de receber a saída de program . Isso provavelmente não é mais curto. No entanto, isso deve teoricamente permitir a definição de um pseudônimo como o seguinte

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

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

    
por 29.10.2012 / 19:25