Terminal - sao chép từ CLI mà không cần sử dụng chuột


20

Trong khi bắn các lệnh trong CLI, tôi muốn sao chép lệnh tôi vừa bắn hoặc bất cứ thứ gì tôi đã viết trong terminal và dán nó vào một nơi khác mà không cần sử dụng chuột.

Giống như trong hình sau, tôi muốn sao chép lệnh cập nhật (hoàn toàn hoặc một phần) mà không cần sử dụng chuột và dán nó vào đâu đó.

sao chép từ CLI mà không cần sử dụng chuột


1
Bạn đang sử dụng gnome mà không có chuột?
ott--

Câu trả lời:


11

Bạn có thể sử dụng screen(1) trong mô phỏng thiết bị của bạn lựa chọn ( xterm, gnome-terminal, ...).

Các chức năng bạn cần được tích hợp sẵn screen. Bạn cần làm quen với cách thức hoạt động:

  • theo mặc định, liên kết phím "lệnh" là Ctrl+ A, bạn soạn các lệnh bằng cách đưa ra chuỗi "lệnh" cộng với hành động cụ thể.
  • lệnh "sao chép" là: AltGr+[
  • lệnh "dán" là AltGr+]

Bạn có thể "sao chép" lệnh và "dán" vào một thiết bị đầu cuối khác.

screen rất thú vị và một khi bạn bắt đầu sử dụng nó, bạn sẽ tự hỏi làm thế nào có thể bạn chưa từng sử dụng nó.


Không có screenlệnh, vì vậy tôi đã cài đặt nó trong gnome-terminal và bắt đầu screentrong một terminal. Nhưng không thể bắt đầu sau đó. Ngoài ra tôi không hiểu ý bạn là gì bởi màn hình tích hợp.
nguyện

1
Đọc man screen. Ngoài ra, tôi đã viết 'tích hợp trong màn hình', nghĩa là chức năng sao chép / dán có trong screen thiết kế .
dawud

Bạn cần sử dụng spacephím để chọn khu vực mong muốn. Bạn cần sử dụng Yđể sao chép toàn bộ dòng hoặc khu vực mong muốn. Màn hình là viphong trào thân thiện.
FelikZ

AltGrchìa khóa là gì Tôi cóAlt
alrcal

1
Các screencông cụ không hoạt động đã giải thích ở đây. Và nó dường như không cung cấp một câu trả lời cho câu hỏi.
Luís de Sousa

7

Ngoài các câu trả lời đã được cung cấp, bạn có thể xem xét chuyển sang trình giả lập thiết bị đầu cuối linh hoạt hơn.

Nếu bạn đã sẵn sàng thay đổi thiết bị đầu cuối thành rxvt-unicode , bạn có thể sử dụng một công cụ như urxvt-perls : một tập hợp các tập lệnh cung cấp chức năng bàn phím sau trong trình giả lập thiết bị đầu cuối đó:

  • chọn, sao chép và dán văn bản
  • chuyển tiếp và tìm kiếm ngược
  • đánh dấu và mở URL trong trình duyệt ưa thích của bạn

Bạn chỉ cần cài đặt gói và sau đó thêm một vài dòng cho bạn ~/.Xresources, và sau đó bạn có thể rút phích cắm của loài gặm nhấm cho tốt.


4

Bạn có thể làm điều này bằng cách sử dụng một chương trình như xclip:

NAME
   xclip - command line interface to X selections (clip‐
   board)

Khi bạn đã cài đặt nó, bạn có thể sử dụng nó để kết nối với bảng tạm X của bạn. Thật không may, điều này sẽ không hoạt động trong mysqlmôi trường của bạn (nó có bộ đệm riêng cho các dòng được sao chép) nhưng nó sẽ nếu bạn muốn chạy một lệnh 'bình thường'. Ví dụ :

$ This is a long command line

CtrlAđể đi đến đầu dòng, kèm theo lệnh trong dấu ngoặc kép rồi lặp lại:

$ echo -e "This is a long command line" |xclip 

Bây giờ bạn có "Đây là một dòng lệnh dài" trong bảng tạm bấm chuột giữa của bạn.

Nếu bạn muốn dán mà không sử dụng chuột, nó sẽ phụ thuộc vào nơi bạn dán. Bạn có thể dán vào thiết bị đầu cuối khác bằng cách chạy:

$ xclip -o

Bạn có thể dán vào cùng một thiết bị đầu cuối, chỉ đơn giản bằng cách giết (cắt) lệnh CtrlKvà sau đó dán CtrlY.

Bạn cũng có thể lưu các lệnh trên các thiết bị đầu cuối bằng cách sử dụng lịch sử của bash. Thêm dòng này vào ~/.bashrc:

PROMPT_COMMAND='history -a; history -r'

PROMPT_COMMANDlà một biến bash đặc biệt. Nếu nó được đặt, giá trị được thực thi dưới dạng lệnh trước khi đưa ra lời nhắc mới. history -asẽ ghi lịch sử của phiên hiện tại vào tệp lịch sử và history -rsẽ tải lại tệp đó. Điều này có nghĩa là mọi lệnh bạn chạy sẽ được ghi ngay vào tệp lịch sử.

Bây giờ khi bạn chạy một dòng lệnh dài, bạn có thể chuyển sang một thiết bị đầu cuối khác và nhấn return (chỉ để chạy $PROMT_COMMAND, thay vào đó, mở một cửa sổ thiết bị đầu cuối mới) và nó sẽ có thể truy cập vào lịch sử của thiết bị đầu cuối này. Nếu bây giờ bạn nhấn Upbạn có thể chạy nó trên thiết bị đầu cuối mới.


Không sao, nhưng tôi vẫn phải sử dụng chuột?
nguyện

@PrayagUpd ah, vâng, nó sẽ sao chép vào bộ đệm nhấp chuột giữa. Xem câu trả lời cập nhật cho một cách khác.
terdon

Tôi nghĩ rằng đó $ xclip -okhông phải là những gì tôi muốn bởi vì nó chỉ in những gì tôi xcliped. Nhưng +1 để Ctrl+Atheo sau Ctrl+KCtrl+Yđể cắt và dán ít nhất trong cùng một thiết bị đầu cuối.
nguyện

@PrayagUpd có một số bộ đệm clipboard khác nhau khi chơi và giải pháp sẽ phụ thuộc vào chính xác những gì bạn muốn làm. Bạn có thể cập nhật câu hỏi của bạn với một ví dụ cụ thể về những gì bạn cần? Tôi có nghĩa là sao chép từ đâu (mysql sẽ khó khăn) và đến đâu.
terdon

1
@PrayagUpd xem câu trả lời cập nhật cho một mẹo khác.
terdon

1

@evilsoup đã đề xuất một giải pháp tốt nhưng nó thường bị hỏng.

Giải pháp nhanh

Đây là một giải pháp không bao giờ phá vỡ .

history | tail -2 | head -1 | xclip -selection clipboard

Chỉ cần chạy lệnh này và nó sẽ sao chép lệnh bạn vừa chạy vào bảng tạm.

Về cơ bản, những gì nó làm là nó in lịch sử lệnh của bạn và nhận lệnh cuối cùng thứ hai và đưa nó vào bảng tạm của bạn (lệnh cuối cùng là chính nó, vì vậy nó chọn lệnh cuối cùng thứ hai).

Một chức năng tùy chỉnh

Phát triển dựa trên giải pháp nhanh, đây là một chức năng nhỏ mà tôi đã viết khá thông minh và sẽ sao chép lệnh được sử dụng cuối cùng. Bạn cũng có thể cung cấp các đối số số để sao chép lệnh cuối cùng. Ví dụ: để sao chép lệnh cuối cùng thứ hai cung cấp 2làm đối số

myclipcopy () {

  if [ -z $1 ]
    then  # if no argument was provided then just copy the last used command
    history | tail -2 | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo 'Anyways, the following command has been copied:'
    history | tail -2 | head -1| sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'

  else
    myindex=$(( $1+1 ))
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo "The following command has been copied:"
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'
  fi

  #Delete this command itself from the history
  myhisnum=$(history | tail -1 | grep -oP '\s\d+\s' | grep -oP '\d+'); history -d $myhisnum
}

Sao chép-dán chức năng trên trong ~/.bashrctập tin của bạn . Lưu ý rằng nếu bạn đặt tệp này vào một tệp tập lệnh bash riêng và chạy tập lệnh, nó sẽ không hoạt động vì lệnh lịch sử sẽ không thể truy cập vào lịch sử của bạn trong trường hợp đó.

Cuối cùng, chạy nó như:

myclipcopy 3
# This copies the third-last command

Hơn nữa, một tính năng thú vị được thêm vào chức năng này là nó tự xóa khỏi lịch sử sau khi được chạy. Điều này rất hữu ích vì sau đó chỉ số "lạc hậu" của các lệnh không thay đổi.


Điều này không mạnh mẽ .
mikeerv

@mikeerv: Bây giờ tôi đã đổi tên thành "Chức năng tùy chỉnh". Nhưng tại sao bạn lại downvote nó? Bạn không nhận thấy rằng điều này trả lời đúng câu hỏi? Hơn nữa, tại sao tôi nói "mạnh mẽ" là bởi vì nó thực sự không bao giờ nên phá vỡ. Bằng cách tải xuống, bạn chỉ cần ẩn một câu trả lời thích hợp từ bài viết.
shivams

Tôi đánh giá thấp bởi vì bạn giả định rất nhiều : đặc biệt là bash và linux, cả hai đều không được chỉ định trong câu hỏi. Ngoài ra, đường ống của bạn quá phức tạp một cách lố bịch, và điều tương tự cũng đúng với regex của bạn
mikeerv

@mikeerv: Cảm ơn bạn đã bình luận. Hy vọng điều này sẽ giúp tôi tạo ra câu trả lời tốt hơn. Tôi sẽ chấp nhận rằng regex và đường ống của tôi là xấu. Nhưng họ đã được thử nghiệm tốt và tôi đã được sử dụng nó. Và đối với các giả định, bạn có nhận thấy rằng câu trả lời được đánh giá cao nhất đã đưa ra giả định rằng người dùng đang sử dụng screen. Câu trả lời được đánh giá cao thứ hai cũng đã được giả định bashlinux. Hơn nữa, giả sử bashkhông phải là một vấn đề lớn vì kịch bản vẫn sẽ hoạt động được tìm thấy trong zsh hoặc hầu hết các shell khác.
shivams

Tôi đã không nói rằng nó là xấu xí - tôi đã nói nó quá phức tạp. Và không, nó sẽ không hoạt động tốt trong hầu hết các vỏ khác . Và hơn thế nữa, CLI thực sự được hình dung trong câu hỏi là MySQL. Điểm tốt về các câu trả lời khác, mặc dù.
mikeerv

0

Lệnh này sử dụng mở rộng lịch sử của bash (để !!mở rộng ra dòng cuối cùng bạn đã nhập vào thiết bị đầu cuối). Bạn có thể sẽ phải cài đặt xcliphoặc xsel.

echo "!!" | xclip -selection clipboard

echo "!!" | xsel -i --clipboard

Điều này sẽ đặt lệnh cuối cùng của bạn vào Ctrl+ vclipboard, vì vậy bạn sẽ có thể dán vào bất kỳ chương trình GUI nào (hoặc với Ctrl+ Shift+ vtrong hầu hết các trình giả lập thiết bị đầu cuối, hoặc với "+pvim).

Điều này sẽ phá vỡ đối với một số dòng chứa dấu ngoặc kép, ví dụ:

$ echo "foo;bar"
foo;bar
$ echo "!!"
echo "echo "foo;bar""
echo foo
The program 'bar' is currently not installed. You can install it by typing:
sudo apt-get install bar

Nó sẽ làm việc cho lệnh bạn đã đưa ra làm ví dụ; bạn chỉ nên có vấn đề nếu dấu ngoặc kép đang thoát ; & && | ||và cứ thế.


Cảm ơn câu trả lời này, đây là giải pháp thiết thực nhất tôi có thể thực hiện ngay lập tức. Và tôi tin rằng các vấn đề với "có thể tránh được chỉ đơn giản bằng cách không trích dẫn !! ở tất cả, chỉ cần làm echo !!và nó sẽ làm việc một cách hoàn hảo (trừ trường hợp không thể xảy ra rằng lệnh trước đó của bạn bắt đầu với -nhoặc -ehoặc vài lựa chọn khác mà echobản thân mất).
- Phục hồi Monica

0

Có thể không phải là giải pháp tiện lợi nhất nhưng tôi sử dụng nó và vì vậy nó có thể hữu ích cho những người khác hơn nữa, nó không yêu cầu bất kỳ cài đặt mềm bổ sung nào.

  1. Bạn cần tạo một tập tin tạm thời tại bất kỳ thư mục thuận tiện

  2. Chuyển hướng hoặc văn bản cần thiết vào tập tin đó. Để chuyển hướng bạn có thể sử dụng

    echo $(pwd) 1> tempo
    
  3. Để có được hướng từ lệnh sử dụng tệp

    cd $(tail -n 1 tempo)
    

Để sao chép và dán các lệnh, hệ thống này sẽ hoạt động một trong hai khóa học. Hy vọng rằng nó hữu ích


Kusalananda cảm ơn đã chỉnh sửa. Bây giờ câu trả lời có vẻ tốt hơn nhiều
Dmitriy Kormulev
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.