Jalankan perintah terakhir dengan semua huruf diubah menjadi huruf kecil

15

Banyak kali saya telah menjalankan perintah dengan semua huruf dalam huruf besar (mungkin karena CapsLockaktif), dan saya menekan Entersebelum menyadari ini.

Bagaimana saya bisa menjalankan perintah terakhir dengan semua huruf diubah menjadi huruf kecil?

Radu Rădeanu
sumber
Malu Anda tidak menggunakan zsh. !!:l.
Kevin

Jawaban:

19

Anda dapat mencapainya dengan menambahkan fungsi kecil berikut (saya menyebutnya ??sangat sederhana, tetapi Anda dapat mengubahnya sesuai keinginan) di .bashrcfile Anda :

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

Selanjutnya, ketika Anda akan menjalankan:

?? !!

perintah terakhir akan dijalankan dengan semua huruf menjadi huruf kecil.

Penjelasan

  • !!: ini adalah bagian dari alat sejarah bash, khususnya, ia mengembang ke menjalankan perintah terakhir . Jadi, misalnya, echo !!akan mencetak perintah terakhir yang dijalankan dalam sesi shell khusus ini.
  • "${@,,}: Konstruk ${foo,,} akan mengonversi konten variabel yang $foodikonversi ke semua huruf kecil. $@adalah array dari parameter posisi. Ketika digunakan di dalam suatu fungsi, itu diperluas ke parameter yang diteruskan ke fungsi itu.

Jadi, "${@,,}"hanya akan mengubah apa pun yang dilewatkan ke fungsi menjadi huruf kecil dan kemudian jalankan. Oleh karena itu, menjalankan ??fungsi dengan !!sebagai parameter akan mengubah perintah terakhir menjadi huruf kecil dan menjalankannya.

Radu Rădeanu
sumber
7
Mungkin Anda bisa menambahkan penjelasan tentang cara kerjanya? Sangat samar cara Anda menulisnya. Juga, itu tidak benar-benar berfungsi. Seperti yang sudah Anda tulis, itu hanya akan berfungsi dengan benar jika PWD Anda kosong. Anda perlu mengutip "!!".
terdon
1
@terdon Sekarang, terima kasih kepada glenn, itu harus berfungsi dalam hal apa pun ... Dan tidak ada terlalu banyak untuk menjelaskan: fungsi ??mengubah huruf argumennya menjadi huruf kecil dan !!menulis ulang secara otomatis perintah sebelumnya dalam perintah saat ini (jadi ??ambil sebagai argumen perintah sebelumnya).
Radu Rădeanu
6
`gema !! | tr '[: atas:]' '[: lebih rendah:]' `

Kuncinya ada di `kutipan (backticks) - yang menjalankan output sebagai perintah.

pedrito
sumber
2
Torehan di mana tidak terlihat dalam versi pertama jawaban, karena bahasa markup. Tidak perlu downvote (tanpa komentar) untuk ini; cukup edit.
Rmano
trakan menjadi pilihan pertama saya juga. Juga berfungsi (alternatif untuk backticks dan tanpa kelas-bracket POSIX):$( echo !! | tr '[A-Z]' '[a-z]')
belacqua
4

inilah jawaban programmer .... gunakan python:

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

Atau Ruby:

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

Atau Perl (mungkin favorit saya):

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

Atau PHP:

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

Atau Awk:

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

Atau Sed:

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

Atau Bash:

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

Atau zsh

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

Atau NodeJS jika Anda memilikinya:

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

Anda juga bisa menggunakannya dd (tapi saya tidak mau!):

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

Anda juga dapat membuat skrip kecil untuk melakukan pekerjaan:

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

Yang Anda gunakan seperti ini:

`echo !! | lower`
nettux
sumber
1

Dan yang satu dengan sed,

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

Contoh:

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

Keluaran:

$(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
sumber