Làm cách nào để sao chép toàn bộ dòng lệnh vào clipboard của tôi mà không cần chuột?


20

Hãy tưởng tượng rằng tôi có dòng này trong thiết bị đầu cuối của mình:

youtube-dl --get-thumbnail --extract-audio --audio-format mp3 https://www.youtube.com/watch?v=

Sau khi thử nghiệm nó, tôi muốn sao chép dòng này ở trên vào clipboard của mình và dán nó vào một số tập tin kịch bản. Không phải đầu ra của lệnh . Nhưng, làm điều này mà không cần sử dụng chuột. Tôi chỉ thích giữ tay ở bàn phím. Tôi nghĩ là nhanh hơn theo cách đó, để làm một số mã hóa :)

Câu trả lời:


22

Câu trả lời của tôi cung cấp một lệnh đơn giản theo ba cú pháp khác nhau, tất cả đều hoạt động như nhau, nhưng một cú pháp ngắn hơn và dễ gõ hơn so với cú pháp thứ hai. Biến thể thứ ba là một bí danh được gọi là bí danh, có nghĩa là bạn có thể gán cho lệnh một tên tùy chỉnh và gọi nó bằng cách thực hiện nó mà không cần phải nhớ những thứ phức tạp.

Chuẩn bị:

Đầu tiên, cài đặt gói xselcho phép bạn truy cập bảng tạm X từ thiết bị đầu cuối:

sudo apt-get install xsel

Biến thể lệnh 1 (ngắn):

Sau đó, bạn có thể nhập dòng sau để sao chép lệnh trước đó vào bảng tạm:

xsel -ib <<<!!:q

Nếu bạn muốn sao chép lệnh mới nhất thứ hai, hãy thay thế !!bằng !-2, cho lần sử dụng mới nhất thứ ba !-3, v.v.

Để giải thích những gì bạn đang chạy, đây là một sự cố ngắn của lệnh:

  • xsellà một công cụ dòng lệnh để truy cập các bảng X.
    Để biết thêm thông tin, hãy đọc trang này trực tuyếnBiểu tượng trang hoặc bằng cách chạy man xsel.

    • Các -itham số kể xselđể đọc từ stdin (thường là đầu vào phương tiện bàn phím này, nhưng chúng ta sẽ chuyển hướng một cái gì đó ở đây)
    • Các -bquy định cụ thể thông số để sử dụng clipboard thay vì X "chính" hoặc lựa chọn "phụ".
  • <<<là một cú pháp Bash đặc biệt gọi là "Here String".
    Về cơ bản, nó mở rộng (không đánh giá!) Đối số (chỉ có một!) Sau nó và chuyển hướng nó thành chuỗi thành stdin (đầu vào tiêu chuẩn) của lệnh trước / sau khi nó đứng.

  • !!:qđược gọi là "lệnh bang" để mở rộng lịch sử trong bash. Nó thay thế chính nó bằng bất kỳ dòng lệnh đã gõ trước đó.
    Để biết thêm thông tin, hãy đọc trang web địa phương bằng cách chạy man history(trang web trực tuyến không hữu ích).

    • Chữ !!viết tắt của dòng lệnh trước đó và là từ đồng nghĩa với !-1.
      Rõ ràng !-2có nghĩa là dòng lệnh cuối cùng thứ hai. Đừng quên dấu trừ -, nếu không nó sẽ trả về lệnh thứ 2 (thứ 3 / ...) mà bạn đã từng gõ.
    • Việc :qsửa đổi lệnh bang và yêu cầu bash kèm theo sự thay thế trong dấu ngoặc đơn ( ') để ngăn chặn sự mở rộng thêm của shell.

Biến thể lệnh 2 (dài hơn một chút):

echo !!:q | xsel -ib
  • echo có công việc đơn giản là in tất cả các đối số của nó lên thiết bị xuất chuẩn của thiết bị đầu cuối.

  • !!:qđược gọi là "lệnh bang" để mở rộng lịch sử trong bash. Nó thay thế chính nó bằng bất kỳ dòng lệnh đã gõ trước đó.

    • Chữ !!viết tắt của dòng lệnh trước đó và là từ đồng nghĩa với !-1. Rõ ràng !-2có nghĩa là dòng lệnh cuối cùng thứ hai. Đừng quên dấu trừ -, nếu không nó sẽ trả về lệnh thứ 2 (thứ 3 / ...) mà bạn đã từng gõ.
    • Việc :qsửa đổi lệnh bang và yêu cầu bash kèm theo sự thay thế trong dấu ngoặc đơn ( ') để ngăn chặn sự mở rộng thêm của shell.
  • |là một đường ống. Nó chuyển hướng đầu ra đầu cuối ("stdout") của lệnh trước khi nó đến đầu vào đầu cuối ("stdin") của lệnh sau nó.

  • xsellà một công cụ dòng lệnh để truy cập các bảng X.
    Để biết thêm thông tin, hãy đọc trang này trực tuyếnBiểu tượng trang hoặc bằng cách chạy man xsel.

    • Các -itham số kể xselđể đọc từ stdin (thường là đầu vào phương tiện bàn phím này, nhưng chúng ta sẽ chuyển hướng một cái gì đó ở đây)
    • Các -bquy định cụ thể thông số để sử dụng clipboard thay vì X "chính" hoặc lựa chọn "phụ".

Biến thể lệnh 3 (bí danh):

Bí danh bash là một điều tuyệt vời nếu bạn không muốn nhớ các lệnh dài hoặc phức tạp bạn thường sử dụng. Bạn có thể gán lệnh này cho một tên bí danh đơn giản, bạn có thể chạy thay vì lệnh dài để đạt được điều tương tự.

Thật không may, vì các lệnh bang là một tính năng Bash đặc biệt và được mở rộng trước khi các bí danh được giải quyết, bạn không thể đơn giản là một trong những biến thể ở trên vì !!phần này sẽ không hoạt động. Có một cách giải quyết mặc dù.

Để đặt bí danh, hãy chạy dòng sau trong thiết bị đầu cuối của bạn. Lưu ý rằng bạn có thể chọn bất kỳ tên biến Bash hợp lệ nào thay vì copylastcommand:

alias copylastcommand='history -p \!\! | xsel -ib'

Tuy nhiên, điều này chỉ tồn tại trong phiên Bash hiện tại của bạn, điều đó có nghĩa là bí danh sẽ biến mất sau khi bạn đóng cửa sổ terminal. Bạn có thể làm cho nó bền bỉ trong mỗi phiên Bash của bạn bằng cách thêm dòng này ở trên vào cuối ~/.bashrctệp của bạn hoặc vào ~/.bash_aliasestệp của bạn nếu bạn có.

Một lần nữa, một sự cố ngắn của dòng:

  • alias name='command'là cú pháp để đặt bí danh trong Bash. Các commandsẽ được chạy bất cứ khi nào bạn thực hiện nametừ bây giờ.

  • history -p \!\!xuất dòng lệnh đã thực hiện trước đó thành thiết bị xuất chuẩn (đầu ra tiêu chuẩn). Không có công -ptắc, nó không chỉ in mà còn chạy lại lệnh.
    Lưu ý rằng chúng ta cần thoát khỏi bangs ( !) bằng dấu gạch chéo ngược ( \), vì nếu không, bash sẽ mở rộng chúng khi chúng ta cố gắng đặt bí danh, điều này không có nghĩa gì khi chúng cần nằm trong bí danh.
    Một lần nữa, bạn cũng có thể chỉ định lệnh gần đây [n] bằng cách thay thế tiếng nổ thứ hai bằng -n, ví dụ \!-2.

  • |là một đường ống. Nó chuyển hướng đầu ra tiêu chuẩn ("stdout") của lệnh trước khi nó tới tiêu chuẩn đầu cuối ("stdin") của lệnh sau nó.

  • xsellà một công cụ dòng lệnh để truy cập các bảng X.
    Để biết thêm thông tin, hãy đọc trang này trực tuyếnBiểu tượng trang hoặc bằng cách chạy man xsel.

    • Các -itham số kể xselđể đọc từ stdin (thường là đầu vào phương tiện bàn phím này, nhưng chúng ta sẽ chuyển hướng một cái gì đó ở đây)
    • Các -bquy định cụ thể thông số để sử dụng clipboard thay vì X "chính" hoặc lựa chọn "phụ".

1
Câu trả lời tốt đẹp, nhưng bạn có thể tránh đường ống? Khá vui lòng? <<<"!!" xsel -ib
kos

@kos vâng, cảm ơn. Điều đó làm cho nó dễ dàng hơn một chút. Bạn có thể giúp tâm trí của tôi để nhớ làm thế nào <<<cấu trúc được gọi lại? Và tôi nghĩ <<<!!:q xsel -iblà tốt hơn (để lệnh lịch sử làm báo giá), hoặc bạn không đồng ý?
Chỉ huy Byte

Nhưng !!:qsử dụng dấu ngoặc đơn ( ') ...
Chỉ huy Byte

Bạn nói đúng, việc mở rộng sẽ được thực hiện bằng cách sử dụng <<<"!!" xsel -ib. Vâng, <<<!!:q xsel -ibtốt hơn, đi cho nó.
kos

Đẹp, xselcó cú pháp thú vị
Sergiy Kolodyazhnyy

5

Bạn có thể sử dụng xclip:

some_command | xclip -selection c

Vì vậy, trong trường hợp của bạn:

youtube-dl .... | xclip -selection c

c là viết tắt của clipboard.

Bạn có thể cần phải cài đặt xcliptrước:

sudo apt-get install xclip

CHỈNH SỬA:

Nếu bạn chỉ muốn lệnh bạn đã gõ (không phải đầu ra) được sao chép vào bảng tạm, bạn có thể sử dụng chuỗi ở đây:

 xclip -selection c <<<"$(echo foobar)"

Hoặc một đường ống:

echo foobar | xclip -selection c

1
Tôi vẫn nhận được các đầu ra lệnh, nhưng tôi chỉ muốn dòng chính nó.
Valter Silva

echo "command" | xclip -selection clipboard... Hoặc làm cho nó thành một kịch bản theo~/.bin : echo "$@" | xclip -selection clipboard. Giả sử bạn lưu nó dưới dạng "cpy", sau đó bạn có thể cpy youtube-dl stuffvà nó sẽ được sao chép vào bảng tạm mà không được thực thi.
Alex

Và nếu bạn muốn nó được thực thi ... echo "$@" | xclip -selection c && $@, hoặc một cái gì đó thông minh hơn với eval ...
Alex

@ValterHenrique Vui lòng kiểm tra các chỉnh sửa của tôi ..
heemayl

3

Tôi chỉ tạo một kịch bản nhỏ để zshsử dụng xclipđể làm điều này:

#!/bin/zsh
export HISTFILE=~/.zsh_history
fc -R
fc -l | tail -n 2 | sed -n '1p' | sed 's/[0-9]*  //' | xclip -selection c

Kịch bản lệnh này sao chép lệnh cuối cùng được nhập vào shell / terminal vào bảng tạm của hệ thống. Nó sẽ không hoạt động trên một máy chủ từ xa điển hình.

Tôi nghĩ rằng tôi sẽ mất vài phút để viết kịch bản này, nhưng mất nhiều thời gian để làm cho nó hoạt động khi tôi vấp ngã trong cách zshxử lý lịch sử.

Cái tail -n 2đầu tiên và sedtrong đó là đối phó với thực tế là lệnh cho chính kịch bản này đang được ghi lại trong lịch sử và do đó, nó nhận được hai dòng lịch sử và loại bỏ dòng cuối cùng.

Kịch bản này hoạt động, và nó là một câu đố vui, nhưng tôi thực sự tò mò liệu có cách nào đơn giản hơn hoặc thanh lịch hơn để làm điều này với zsh.


Vâng, bạn có thể đơn giản hóa các lệnh tailsedthành một hoặc hai lệnh. Những lệnh sử dụng !!được giải thích ở đây - nó sẽ có sẵn trong ZSH ....
Wilf

Ồ, !!thực sự có vẻ như nó sẽ hữu ích ở đây, cảm ơn!
alec

0

Tôi đang sử dụng như một trình quản lý clipboard, vì vậy.

alias pbpaste='xclip -i -selection clipboard -o'
alias pbcopy='xclip -selection clipboard'
vimscratch='vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' 

Lệnh cuối cùng để clipboard

alias last2cb='fc -ln -1 | pbcopy'

Clipboard để vim đầu

alias vcb='pbpaste | vimscratch -'

ZSH cụ thể

# Copy the most recent command to the clipboard
function _pbcopy_last_command(){
    fc -ln -1 | pbcopy
}
zle -N pbcopy-last-command _pbcopy_last_command
bindkey '^x^y' pbcopy-last-command
# Ctrl-x Ctrl-y  to copy last command to the clipboard


# Edit content of clipboard on vim (scratch buffer)
function _edit_clipboard(){
    pbpaste | vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' -
}
zle -N edit-clipboard _edit_clipboard
bindkey '^x^v' edit-clipboard
# Ctrl-x Ctrl-v to edit clipboard on vim


# define function that retrieves and runs last command
function run-again {
    # get previous history item
    zle up-history
    # confirm command
    zle accept-line
}
# define run-again widget from function of the same name
zle -N run-again
bindkey '\er' run-again
# alt-r to run last command again

Tôi nghĩ những ý tưởng này có thể giúp bạn tạo ra giải pháp của riêng bạ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.