Ejecute el último comando con todas las letras transformadas a minúsculas

15

Muchas veces he ejecutado un comando con todas las letras en mayúscula (tal vez porque CapsLockestaba activado), y presioné Enterantes de darme cuenta.

¿Cómo puedo ejecutar el último comando con todas las letras transformadas a minúsculas?

Radu Rădeanu
fuente
Es una pena que no estés usando zsh. !!:l.
Kevin

Respuestas:

19

Puede lograr eso agregando la siguiente función pequeña (lo llamo ??muy simple, pero puede cambiar esto como lo desee) en su .bashrcarchivo:

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

A continuación, cuándo correrás:

?? !!

el último comando se ejecutará con todas las letras en minúsculas.

Explicación

  • !!: esto es parte de las herramientas de historial de bash, específicamente, se expande hasta la última ejecución del comando . Entonces, por ejemplo, echo !!imprimirá el último comando ejecutado en esta sesión de shell en particular.
  • "${@,,}: La construcción ${foo,,} convertirá el contenido de la variable $fooconvertida a todas las letras minúsculas. $@es la matriz de parámetros posicionales. Cuando se usa dentro de una función, se expande a los parámetros pasados ​​a esa función.

Entonces, "${@,,}"simplemente convertirá lo que se pasó a la función en minúsculas y luego lo ejecutará. Por lo tanto, ejecutar la ??función !!como parámetro convertirá el último comando a minúsculas y lo ejecutará.

Radu Rădeanu
fuente
77
¿Quizás podría agregar una explicación de cómo funciona esto? Es muy críptico la forma en que lo has escrito. Además, en realidad no funciona, como tal. Como lo ha escrito, solo funcionará correctamente si su PWD está vacía. Necesita citar el "!!".
terdon
1
@terdon Ahora, gracias a glenn, debería funcionar en cualquier caso ... Y no hay mucho que explicar: la función ??convierte sus letras de argumentos en minúsculas y !!reescribe automáticamente el comando anterior en el comando actual (así que ??toma como argumento el comando anterior).
Radu Rădeanu
6
`echo !! El | tr '[: superior:]' '[: inferior:]' '

La clave está en las `citas (backticks), que ejecuta la salida como un comando.

pedrito
fuente
2
Los backticks eran invisibles en la primera versión de la respuesta, debido al lenguaje de marcado. No es necesario hacer un voto negativo (sin comentarios) por esto; solo edita.
Rmano
trsería mi primera opción también. También funciona (alternativa a los backticks y sin las clases de soporte POSIX):$( echo !! | tr '[A-Z]' '[a-z]')
belacqua
4

aquí viene una respuesta de los programadores ... use python:

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

O rubí:

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

O Perl (probablemente mi favorito):

`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 si lo tienes:

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

También podría usar dd(¡pero no lo haría!):

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

También puede crear un pequeño script para hacer el trabajo:

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

Que usas así:

`echo !! | lower`
nettux
fuente
1

Y el que tiene sed,

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

Ejemplo:

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

Salida:

$(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^
Avinash Raj
fuente