Chạy lệnh cuối cùng với tất cả các chữ cái được chuyển thành chữ thường


15

Nhiều lần tôi đã chạy một lệnh với tất cả các chữ cái in hoa (có thể vì CapsLockđã bật) và tôi đã nhấn Entertrước khi nhận ra điều này.

Làm thế nào tôi có thể chạy lệnh cuối cùng với tất cả các chữ cái được chuyển thành chữ thường?


Thật xấu hổ khi bạn không sử dụng zsh. !!:l.
Kevin

Câu trả lời:


19

Bạn có thể thực hiện điều đó bằng cách thêm chức năng nhỏ sau đây (tôi gọi nó ??là rất đơn giản, nhưng bạn có thể thay đổi điều này như bạn muốn) trong của bạn .bashrctập tin:

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

Tiếp theo, khi bạn sẽ chạy:

?? !!

lệnh cuối cùng sẽ được chạy với tất cả các chữ cái viết thường.

Giải trình

  • !!: đây là một phần của các công cụ lịch sử của bash, cụ thể, nó mở rộng đến lần chạy lệnh cuối cùng . Vì vậy, ví dụ, echo !!sẽ in ra lệnh chạy cuối cùng trong phiên shell cụ thể này.
  • "${@,,}: Cấu trúc ${foo,,} sẽ chuyển đổi nội dung của biến được $foochuyển đổi thành tất cả các chữ cái viết thường. $@là mảng các tham số vị trí. Khi được sử dụng bên trong một hàm, nó được mở rộng thành các tham số được truyền cho hàm đó.

Vì vậy, "${@,,}"sẽ chỉ đơn giản chuyển đổi bất cứ thứ gì được chuyển đến hàm thành chữ thường và sau đó thực hiện nó. Do đó, việc chạy ??hàm với !!tham số sẽ chuyển đổi lệnh cuối cùng thành chữ thường và chạy nó.


7
Có lẽ bạn có thể thêm một lời giải thích về cách thức này hoạt động? Nó rất khó hiểu theo cách bạn đã viết nó. Ngoài ra, nó không thực sự hoạt động, như vậy. Như bạn đã viết, nó sẽ chỉ hoạt động chính xác nếu PWD của bạn trống. Bạn cần trích dẫn "!!".
terdon

1
@terdon Bây giờ, nhờ glenn, cần làm việc trong mọi trường hợp ... Và không có gì quá nhiều để giải thích là: chức năng ??chuyển đổi đối số của nó thư cho lowercaes và !!tái ghi automaticaly lệnh trước đó trong lệnh hiện tại (do ??mất như lập luận lệnh trước).
Radu Rădeanu

6
`vang vọng !! | tr '[: trên:]' '[: dưới:]' `

Khóa nằm trong `trích dẫn (backticks) - chạy đầu ra dưới dạng lệnh.


2
Các backticks nơi vô hình trong phiên bản đầu tiên của câu trả lời, do ngôn ngữ đánh dấu. Không cần downvote (không có bình luận) cho điều này; Chỉ cần chỉnh sửa.
Rmano

trcũng sẽ là lựa chọn đầu tiên của tôi Cũng hoạt động (thay thế cho backticks và không có lớp khung POSIX):$( echo !! | tr '[A-Z]' '[a-z]')
belacqua

4

Ở đây có một lập trình viên trả lời .... sử dụng python:

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

Hoặc Ruby:

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

Hoặc Perl (có lẽ là sở thích của tôi):

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

Hoặc PHP:

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

Hoặc Awk:

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

Hoặc Sed:

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

Hoặc Bash:

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

Hoặc zsh

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

Hoặc NodeJS nếu bạn có nó:

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

Bạn cũng có thể sử dụng dd(nhưng tôi sẽ không!):

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

Bạn cũng có thể tạo một tập lệnh nhỏ để thực hiện công việc:

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

Mà bạn sử dụng như vậy:

`echo !! | lower`

1

Và một với sed,

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

Thí dụ:

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

Đầu ra:

$(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^
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.