Esegui l'ultimo comando con tutte le lettere trasformate in minuscolo


15

Molte volte ho eseguito un comando con tutte le lettere in maiuscolo (forse perché CapsLock era attivo) e ho premuto Enterprima di rendermene conto.

Come posso eseguire l'ultimo comando con tutte le lettere trasformate in minuscolo?


Peccato che non stai usando zsh. !!:l.
Kevin,

Risposte:


19

Puoi farlo aggiungendo la seguente piccola funzione (la chiamo ??molto semplice, ma puoi cambiarla come desideri) nel tuo .bashrcfile:

?? () { "${@,,}"; }

Successivamente, quando eseguirai:

?? !!

l'ultimo comando verrà eseguito con tutte le lettere in minuscolo.

Spiegazione

  • !!: fa parte degli strumenti della cronologia di bash, in particolare si espande all'ultima esecuzione del comando . Quindi, per esempio, echo !!stamperà l'ultimo comando eseguito in questa particolare sessione di shell.
  • "${@,,}: Il costrutto ${foo,,} convertirà il contenuto della variabile $fooconvertita in tutte le lettere minuscole. $@è l'array di parametri posizionali. Se utilizzato all'interno di una funzione, viene espanso ai parametri passati a quella funzione.

Quindi, "${@,,}"convertirà semplicemente tutto ciò che è stato passato alla funzione in minuscolo e quindi lo eseguirà. Pertanto, l'esecuzione della ??funzione con !!come parametro convertirà l'ultimo comando in minuscolo ed eseguirà.


7
Forse potresti aggiungere una spiegazione di come funziona? È molto enigmatico il modo in cui l'hai scritto. Inoltre, in realtà non funziona, come tale. Come l'hai scritto, funzionerà correttamente solo se il tuo PWD è vuoto. Devi citare il "!!".
terdon,

1
@terdon Ora, grazie a Glenn, dovrebbe funzionare in ogni caso ... e non c'è niente di troppo da spiegare: la funzione ??converte i suoi argomenti lettere per lowercaes e !!ri-scrittura automaticamente il comando precedente nel comando corrente (in modo ??prende come argomento il comando precedente).
Radu Rădeanu,

6
`eco !! | tr '[: upper:]' '[: lower:]' '

La chiave è tra le `virgolette (backtick) - che esegue l'output come comando.


2
I backtick erano invisibili nella prima versione della risposta, a causa del linguaggio di markup. Non è necessario effettuare il downgrade (senza commento) per questo; basta modificare.
Rmano,

trsarebbe anche la mia prima scelta. Funziona anche (in alternativa ai backtick e senza le classi parentesi POSIX):$( echo !! | tr '[A-Z]' '[a-z]')
belacqua,

4

ecco la risposta di un programmatore .... usa python:

`echo "print '!!'.lower()" | python`

O Ruby:

`echo "print '!!'.downcase" | ruby`

O Perl (probabilmente il mio preferito):

`perl -e "print lc('!!');"`

O PHP:

`php -r "print strtolower('!!');"`

O Awk:

`echo "!!" | awk '{ print tolower($1) }'`

O Sed:

`echo "!!" | sed 's/./\L&/g'`

O Bash:

str="!!" ; ${str,,}

O zsh

echo "A='!!' ; \$A:l" | zsh

O NodeJS se ce l'hai:

`echo "console.log('!!'.toLowerCase());" | node`

Potresti anche usare dd(ma io no!):

 `echo "!!" | dd  conv=lcase 2> /dev/null`

Puoi anche creare un piccolo script per fare il lavoro:

sudo bash -c 'cat << EOF > /usr/local/bin/lower
#!/usr/bin/python
import fileinput
print "".join(fileinput.input()).lower(),
EOF' && sudo chmod +x /usr/local/bin/lower

Che usi così:

`echo !! | lower`

1

E quello con sed,

$(echo !! | sed 's/^\(.*\)$/\L\1/g')

Esempio:

$ SUDO APT-GET UPDATE
SUDO: command not found
$ $(echo !! | sed 's/^\(.*\)$/\L\1/g')

Produzione:

$(echo SUDO APT-GET UPDATE | sed 's/^\(.*\)$/\L\1/g')
[sudo] password for avinash: 
0% [Waiting for headers] [Waiting for headers] [Waiting for headers] [Connectin^
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.