Exécute la dernière commande avec toutes les lettres transformées en minuscules

15

Plusieurs fois, j'ai exécuté une commande avec toutes les lettres en majuscules (peut-être parce que CapsLockc'était activé), et j'ai appuyé Enteravant de réaliser cela.

Comment puis-je exécuter la dernière commande avec toutes les lettres transformées en minuscules?

Radu Rădeanu
la source
Dommage que vous n'utilisiez pas zsh. !!:l.
Kevin

Réponses:

19

Vous pouvez accomplir cela en ajoutant la petite fonction suivante (je l'appelle ??très simple, mais vous pouvez changer cela comme vous le souhaitez) dans votre .bashrcfichier:

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

Ensuite, lorsque vous exécuterez:

?? !!

la dernière commande sera exécutée avec toutes les lettres en minuscules.

Explication

  • !!: cela fait partie des outils d'historique de bash, en particulier, il se développe jusqu'à la dernière exécution de la commande . Ainsi, par exemple, echo !!affichera la dernière commande exécutée dans cette session shell particulière.
  • "${@,,}: La construction ${foo,,} convertira le contenu de la variable $fooconvertie en toutes les lettres minuscules. $@est le tableau de paramètres positionnels. Lorsqu'il est utilisé à l'intérieur d'une fonction, il est étendu aux paramètres passés à cette fonction.

Donc, "${@,,}"il suffit de convertir tout ce qui a été transmis à la fonction en minuscules, puis de l'exécuter. Par conséquent, l'exécution de la ??fonction avec !!comme paramètre convertira la dernière commande en minuscules et l'exécutera.

Radu Rădeanu
la source
7
Peut-être pourriez-vous ajouter une explication sur la façon dont cela fonctionne? C'est très cryptique comme vous l'avez écrit. De plus, cela ne fonctionne pas réellement, en tant que tel. Comme vous l'avez écrit, cela ne fonctionnera correctement que si votre PWD est vide. Vous devez citer le "!!".
terdon
1
@terdon Maintenant, grâce à glenn, cela devrait fonctionner dans tous les cas ... Et il n'y a rien de trop à expliquer: la fonction ??convertit ses lettres d'arguments en minuscules et !!réécrit automatiquement la commande précédente dans la commande en cours ( ??prend donc comme argument la commande précédente).
Radu Rădeanu
6
`écho !! | tr '[: upper:]' '[: lower:]' '

La clé se trouve dans les `(guillemets) citations - qui exécutent la sortie comme une commande.

pedrito
la source
2
Les backticks étaient invisibles dans la première version de la réponse, en raison du langage de balisage. Pas besoin de downvote (sans commentaire) pour cela; éditez juste.
Rmano
trserait aussi mon premier choix. Fonctionne également (alternative aux backticks et sans les brackets POSIX):$( echo !! | tr '[A-Z]' '[a-z]')
belacqua
4

voici une réponse des programmeurs .... utilisez python:

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

Ou Ruby:

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

Ou Perl (probablement mon préféré):

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

Ou PHP:

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

Ou Awk:

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

Ou Sed:

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

Ou Bash:

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

Ou zsh

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

Ou NodeJS si vous l'avez:

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

Vous pouvez également utiliser dd(mais je ne le ferais pas!):

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

Vous pouvez également créer un petit script pour faire le travail:

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 vous utilisez comme ça:

`echo !! | lower`
nettux
la source
1

Et celui avec sed,

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

Exemple:

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

Production:

$(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
la source