Виконайте останню команду з усіма літерами, перетвореними на малі літери


15

Я багато разів виконував команду з великими літерами (можливо, тому, що CapsLockбуло включено), і натискав, Enterперш ніж усвідомити це.

Як я можу виконати останню команду зі всіма літерами, перетвореними на малі літери?


Сором, що ти не використовуєш zsh. !!:l.
Кевін

Відповіді:


19

Ви можете досягти цього, додавши наступну маленьку функцію (я називаю це ??дуже простою, але ви можете змінити це як хочете) у свій .bashrcфайл:

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

Далі, коли ви запустите:

?? !!

остання команда буде запущена з усіх літер у малі літери.

Пояснення

  • !!: це частина інструментів історії bash, зокрема, вона розширюється до останнього запуску команди . Так, наприклад, echo !!буде роздруковано останню команду, запущену в цьому конкретному сеансі оболонки.
  • "${@,,}: Конструкція ${foo,,} перетворить вміст змінної, $fooперетвореної на всі малі літери. $@- це масив позиційних параметрів. При використанні всередині функції вона розширюється до параметрів, переданих цій функції.

Отже, "${@,,}"просто перетворимо все, що було передано функції, у малі регістри, а потім виконаємо її. Тому запуск ??функції з !!параметром перетворить останню команду в малі регістри та запустить її.


7
Можливо, ви могли б додати пояснення, як це працює? Це дуже виразно, як ви це написали. Крім того, вона насправді не працює. Як ви це написали, він буде працювати правильно лише в тому випадку, якщо ваш PWD порожній. Вам потрібно процитувати "!!".
тердон

1
@terdon Тепер, завдяки glenn, це повинно працювати в будь-якому випадку ... І пояснювати це нема чого: функція ??перетворює свої аргументи в нижчі регістри та !!автоматично переписує попередню команду в поточну команду (так ??приймає як аргументуйте попередню команду).
Раду Радеану

6
`відлуння !! | tr '[: верх:]' '[: нижній:]' '

Ключ у `цитатах (backticks) - який запускає висновок як команду.


2
Повернення, де невидимі в першій версії відповіді, через мову розмітки. Для цього не потрібно брати участь (без коментарів); просто відредагуйте.
Рмано

trбув би і моїм першим вибором. Також працює (альтернатива backticks і без $( echo !! | tr '[A-Z]' '[a-z]')
клейових

4

ось відповідь програмістів .... використовувати python:

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

Або Рубі:

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

Або Perl (певно, мій улюблений):

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

Або PHP:

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

Або Awk:

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

Або Sed:

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

Або Баш:

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

Або зш

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

Або NodeJS, якщо у вас є:

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

Ви також можете використовувати dd(але я цього не хочу!):

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

Ви також можете створити невеликий сценарій, щоб виконати цю роботу:

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

Що ви використовуєте так:

`echo !! | lower`

1

І той sed,

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

Приклад:

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

Вихід:

$(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^
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.