Qual è il modo più semplice per eseguire il testo dalla coda alla riga di comando?


10

A volte sto lavorando su una nuova casella (ubuntu) e scrivo gite sono avvisato:

The program 'git' is currently not installed.  You can install it by typing:
apt-get install git-core

Se ciò accade, so che posso prendere l'ultima riga facendo qualcosa del tipo:

!! 2>&1 | tail -n 1

Ma come potrei eseguire il risultato di quello ( apt-get install git-core) più facilmente?

Mi rendo conto di poterlo fare

`!! 2>&1 | tail -n 1`

ma c'è anche un modo per convogliare effettivamente l'output e farlo funzionare? Questo non sembra funzionare:

!! 2>&1 | tail -n 1 | sh

Anche la 2>&1parte è un po 'ingombrante, quindi sarei curioso di sapere se esiste un modo più semplice per farlo.

modificare

Sarebbe anche accettabile salvarlo in qualche modo in una variabile, quindi eseguire la variabile:

!! 2>&1 | tail -n 1 | (store as $mycmd)
$mycmd

Ma non sono sicuro di conoscere un modo per convogliare stdoutuna variabile, almeno non con la variabile che si trova sul lato destro del comando.

Risposte:


8

Quando si digita un comando che non esiste nel proprio sistema bash esegue la funzione command_not_found_handle(). In questa funzione c'è una chiamata allo /usr/lib/command-not-foundscript che stampa i messaggi.

Ubuntu 12.04

La mia prima risposta alla fonte cambiamento di questo script per stampare messaggi a stdoutposto stderr, ma quando stavo leggendo fonte di sceneggiatura ho scoperto che è possibile configurarlo per chiedere solo se si desidera installare il pacchetto mancante.

Se esporti una variabile COMMAND_NOT_FOUND_INSTALL_PROMPTti verrà chiesto di installare il pacchetto mancante:

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ export COMMAND_NOT_FOUND_INSTALL_PROMPT=""
pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
Do you want to install it? (N/y)y
sudo apt-get install git
[sudo] password for pbm: 

Versioni precedenti di Ubuntu

Purtroppo non esiste, COMMAND_NOT_FOUND_INSTALL_PROMPTquindi posso trovare alcune altre opzioni:

1) Installa il pacchetto dalla 12.04 - non dovrebbe essere il problema - sono solo pochi script in Python, quindi dovrebbe funzionare (non testato!).

2) Passa stderra stdout. Per farlo, modifica il file /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.pye stderrpassa stdoutalle righe 237 e 240.

Dopodiché puoi usarlo in questo modo:

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ `git`
//Installation begins

Se si aggiunge l' -yopzione al apt-getcomando nelle righe 237 e 240, è possibile utilizzare anche la sintassi !! | sh.

3) Puoi anche modificare questo script dalla riga 242 in questo modo:

print >> sys.stderr, _("You can install it by typing:")
f = open("%s/.install-missing" % os.path.expanduser('~'),'w')
print >> sys.stderr, "sudo apt-get install %s" % packages[0][0]
print >> f, "sudo apt-get install %s" % packages[0][0]
f.close()

In questo modo otterrai il tuo comando in file ~/.install-missing, quindi puoi creare un alias:

alias im="chmod +x ~/.install-missing; ~/.install-missing"

Se si chiama impacchetto verrà installato.


Hmm, questo sembrava davvero buono, ma in realtà non sembra funzionare su 11.10 onirico, /usr/lib/command-not-foundma non ha alcun riferimento a COMMAND_NOT_FOUND_INSTALL_PROMPT- pensieri?
Cwd,

Ok, sembra che questa sia una funzionalità che farà parte del 12.04 preciso, ( package-import.ubuntu.com/diffs/command-not-found ). Immagino di aver ancora bisogno di una soluzione per le versioni precedenti.
Cwd

@cwd: ho aggiornato la mia risposta ...
pbm

3

Eri sulla strada giusta con:

!! 2>&1 | tail -n 1 | sh

... ma ti manca un'opzione per sh . Ritenere:

!! 2>&1 | tail -n 1 | sh -s

E poiché probabilmente hai bisogno dell'accesso root per eseguire apt-get, considera:

!! 2>&1 | tail -n 1 | sudo sh -s

Questo non funziona sh e sh -s fanno la stessa cosa, almeno in questo caso.
Deepak Mittal,

1

Puoi fare qualcosa del genere:

!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd

I programmi interattivi non sembrano funzionare bene con il piping perché si aspetta un input, 'Y' in questo caso, ma il descrittore di file stdin viene chiuso non appena il primo comando viene superato.


0

Puoi usare una variabile, evale credo che sostituisca il comando (anche se non sono sicuro di quanto tutto questo sia sicuro):

TEST_VAR=$(!! 2>&1 | tail -n 1); eval $TEST_VAR

Sono disposto a essere smentito da quanto sopra. Lo sto testando su una macchina Red Hat con un echocomando piuttosto che quel completamento automatico suggerito ma il principio dovrebbe essere lo stesso.

Alla fine della giornata, sarebbe più veloce digitare aptitude install git ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.