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?


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á.


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.


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`

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^
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.