sao chép lệnh cuối cùng trong terminal


22

Tôi có thể thấy lệnh cuối cùng trong terminal bằng cách nhấn up arrownhư trong ví dụ sau:

Tôi gõ cd /:

Makss-Mac:~ maks$ cd /

... đã nhấn enter, lệnh được cd /thực thi và bây giờ tôi có thể nhấn up arrowvà xem cd /lại lệnh :

Makss-Mac:/ maks$ cd /

Tôi muốn không chỉ thấy lệnh cuối cùng mà còn sao chép nó vào clipboard.

Có thể tồn tại phím tắt không chỉ hiển thị lệnh cuối cùng trong thiết bị đầu cuối (như up arrowlàm) mà đồng thời sao chép nó vào clipboard.

Hoặc có thể có lối tắt để chọn tất cả từ dòng thiết bị đầu cuối hiện tại. Và vì vậy tôi sẽ có thể sao chép lệnh cuối cùng (sau khi nhấn up arrow) bằng cách nhấn super+c. Tất nhiên tôi có thể chọn nó bằng chuột. Nhưng khi các lệnh dài hơn 10 lần cd /thì có thể quá tốn thời gian, đặc biệt là nếu bạn thực hiện cứ sau 30 giây.

Hoặc có thể có cách viết plugin cho Terminal


Có thể dễ dàng hơn để tìm một giải pháp ở đây nếu bạn có thể thêm một số chi tiết về những gì bạn định làm với nội dung của bảng tạm sau đó. Bạn sẽ dán nó ở đâu?
nohillside

có để dán nó vào tab thiết bị đầu cuối khác
Maxim Yefremov

Câu trả lời:


17

Đặt cái này vào ~/.bashrc ~/.bash_profilehoặc bất cứ nơi nào bạn thích:

alias copyLastCmd='fc -ln -1 | awk '{$1=$1}1' | pbcopy '

Sau khi mở một cửa sổ mới (hoặc đang chạy source ~/.bash_profile), bạn sẽ có thể chạy copyLastCmdvà có lệnh trong bảng tạm.

Để giải thích những gì đang diễn ra: về cơ bản bạn đang sử dụng "lệnh sửa lỗi" ( fc) để nhận cho bạn lệnh cuối cùng, xóa cả khoảng trắng hàng đầu và dấu kiểm để định dạng đẹp hơn awkvà sau đó sao chép nó vào bảng điều khiển Mac của bạn pbcopy.

CHỈNH SỬA:

Bây giờ chúng tôi biết rằng bạn muốn sao chép để dán vào tab thiết bị đầu cuối khác, có một tùy chọn khác: Thêm các dòng này vào ~/.bashrc ~/.bash_profilehoặc bất cứ nơi nào bạn thích:

shopt -s histappend
PROMPT_COMMAND='$PROMPT_COMMAND; history -a; history -n'

Sau đó, khi bạn mở một số tab mới (hãy gọi chúng là "tab A" và "tab B"):

  1. Thực hiện bất kỳ lệnh nào trong tab A
  2. Chuyển sang tab B, nhấn enter trên một dòng trống , cung cấp cho bạn một dòng mới "mới" (và do đó đánh giá lại lịch sử)
  3. sử dụng mũi tên lên một lần và bạn sẽ có lệnh bạn vừa nhập vào tab A.

EDIT 2: Tôi đã thay thế cách sử dụng sedvới awktrong câu trả lời ban đầu ở trên, để chăm sóc cả khoảng trắng hàng đầu và dấu cách.


Đó là một bí danh tuyệt vời! Để cắt bỏ dòng mới, để bạn có thể chỉnh sửa lệnh sau khi dán, tôi đã sử dụng awk:alias copyLastCmd='fc -ln -1 | sed '1s/^[[:space:]]*//' | awk 1 ORS="" | pbcopy '
nwinkler

@nwinkler: OH bạn đúng, nên đã sử dụng awk: fc -ln -1 | awk '{$1=$1}1'sẽ xóa cả khoảng trắng theo sau và khoảng trắng hàng đầu.
Asmus

1
đã phải sửa đổi bí danh cho ký tự đặc biệt alias copyLastCmd="fc -ln -1 | awk '{\$1=\$1}1' | pbcopy". vẫn nhận được sự ủng hộ của tôi
Mike D

1
Tôi đã sử dụng nó cho đến khi tôi thực hiện "git -reset --hard" trên một thiết bị đầu cuối và trong một "thư mục git không nghi ngờ" khác nhấn mũi tên và nhập vội vàng khi tôi nghĩ rằng tôi đang chạy một kịch bản mà tôi đang sử dụng trước đó. Bạn có thể tưởng tượng những gì đã xảy ra, và đó là lần cuối cùng tôi sử dụng lịch sử "toàn cầu" được chia sẻ này
MrGigu

@MrGigu đã xảy ra với tôi với một lịch sử "cục bộ" nơi tôi đã nhấn mũi tên "lên" hai lần, thay vì một lần, vô tình - bài học đã học một cách khó khăn, tôi đoán vậy.
Asmus

5

Đây là một cách khác dựa trên câu trả lời của @Asmus. Để làm cho bí danh của anh ấy hoạt động trong tập lệnh bash của tôi, tôi đã phải sử dụng một chút trích dẫn, vì các trích dẫn đơn không hoạt động trong một bí danh được trích dẫn mà không có một số trích dẫn bổ sung:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' | pbcopy'

Các '\''cơ bản sẽ đóng quote hiện tại, sau đó thêm một quote trốn thoát, và sau đó mở quote thực tế một lần nữa.

Phiên bản trên sẽ sao chép lệnh cuối cùng vào bảng tạm của bạn và khi bạn dán nó, nó sẽ được thực thi ngay lập tức, vì cuối cùng nó sẽ có một dòng mới .

Để thoát khỏi dòng mới ở cuối, vì vậy bạn thực sự có thể chỉnh sửa lệnh trước khi chạy nó, bạn có thể làm như sau:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' ORS='\'''\'' | pbcopy'

Các ORS=''(tức mà không cần sự trích dẫn) sẽ lột kí tự xuống dòng trailing, vì vậy bạn có thể chỉnh sửa văn bản dán trước khi chạy nó.


5

Điều này sẽ sử dụng mở rộng lịch sử để lấy lệnh cuối cùng và lặp lại nó. Bạn có thể chuyển sang pbcopyđể lưu lệnh cuối cùng vào clipboard của bạn.

> echo !! | pbcopy

Nếu bạn muốn một lệnh từ lịch sử của bạn không phải là lệnh cuối cùng , bạn có thể chạy:

> history

Và tham khảo số lệnh mong muốn như:

> echo !5 | pbcopy

Nó có thể là sở thích của bạn và thậm chí có thể hoạt động, nhưng bạn cần cung cấp một chút giải thích về những gì lệnh thực sự làm và cách OP (người đã chấp nhận một trong những câu trả lời năm năm trước) có thể sử dụng nó một cách hiệu quả.
IconDaemon

@IconDaemon gọi tốt. Tôi nghĩ rằng điều này đáng để thêm vào một câu hỏi cũ bởi vì nó đơn giản hơn câu trả lời được chấp nhận vì nó không yêu cầu bất kỳ tùy chỉnh hồ sơ.
Sam Berry

4

Tôi đến đây với câu trả lời chính xác của Sam Berry, nhưng nó không hiệu quả với tôi (OSX 10.14.6).

Quản lý để có được nó để làm như vậy với dấu ngoặc kép xung quanh !!:

echo "!!" | pbcopy


3

Bạn có thể đặt lịch sử của mình để bỏ qua các lệnh bắt đầu bằng khoảng trắng:

export HISTIGNORE=' *'

Và sau đó chạy lệnh sau để git lệnh cuối cùng vào bảng tạm (đảm bảo bạn có khoảng trắng ở đầu):

history 1 | cut -d " " -f 4- | pbcopy

Sau đó, bạn có thể muốn lưu lệnh dưới dạng bí danh để dễ nhớ hơn.

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.