Làm thế nào để nhanh chóng có được đầu ra dòng trước trong một thiết bị đầu cuối mà không cần sử dụng chuột?


13

Thiết bị đầu cuối Linux (ví dụ Ubuntu), có phương pháp nào để có được dòng cuối cùng không? Giả sử tôi đang gõ ngẫu nhiên một tdlệnh chưa được cài đặt trên hệ thống của mình, vì vậy tôi sẽ nhận được một thông báo như dưới đây. Tôi muốn có một "phím tắt" để chạy sudo apt-get install textdrawnhanh.

Có một công cụ như vậy hoặc làm thế nào tôi có thể sao chép dòng cuối cùng vào clipboard mà không cần sử dụng chuột?

username@WorkStation:~$ td
The program 'td' is currently not installed. You can install it by typing:
sudo apt-get install textdraw
username@WorkStation:~$

Nhấn mũi tên lên? Bạn đã thử chưa? Ngoài ra hãy kiểm tra lệnh lịch sử trong Linux, nó cũng có thể phù hợp với bạn.
Richie086

Các chương trình ghép kênh đầu cuối, tmux và màn hình, cung cấp khả năng của văn bản getitng vào một bảng tạm. Tuy nhiên, có thể có một cách dễ dàng hơn trong GUI mặc định của Ubuntu, vì vậy tôi nghi ngờ có thể có câu trả lời dễ dàng hơn. Nhấn PGUp, Shift-PGUp hoặc Ctrl-PGUp có thể cho phép cuộn lại.
TUYỆT VỜI

3
@ Richie086 Xin lưu ý, những gì tôi cần là sudo apt-get install textdrawkhông td. mũi tên lên sẽ chỉ cho tôitd
Daniel

Câu trả lời:


6

Nếu bạn không bận tâm một chút tục tĩu (tôi không), bạn có thể muốn sử dụng quái , một công cụ thực hiện chính xác những gì bạn yêu cầu.

Vâng, không chính xác, nhưng nó giải quyết vấn đề tương tự. Thay vì chỉ nhận được dòng mới nhất, nó cố gắng khớp lệnh cuối cùng mà bạn đã nhập.

Quái cố gắng khớp một quy tắc cho lệnh trước đó, tạo một lệnh mới bằng cách sử dụng quy tắc khớp và chạy nó.

Các ví dụ hiển thị trong kho lưu trữ cho thấy một số tình huống bạn đã đề cập.

nhập mô tả hình ảnh ở đây


2

Câu trả lời ngắn gọn: không, có lẽ bạn không có phương pháp khả dụng để làm việc này.

Câu trả lời dài:

  • trong khi có thể có một trình giả lập thiết bị đầu cuối cho phép bạn "chỉ" đọc lại nội dung màn hình và chỉnh sửa chúng, trong thực tế, điều đó không được thực hiện thường xuyên do lo ngại rằng một số chương trình không mong muốn có thể rình mò các mục trên bàn phím của bạn.
  • một shell có thể được thiết kế để nắm bắt đầu ra của các lệnh của bạn và cho phép bạn chỉnh sửa nó (giống như lịch sử lệnh của bạn). Sẽ trở nên phức tạp nếu lệnh giống như thế vi(trong đó đầu ra không phải là văn bản hướng dòng đẹp). Bash không làm điều đó, dù sao.

Trong thực tế, những gì mọi người làm để giải quyết giới hạn này là sử dụng các chương trình khác để nắm bắt đầu ra lệnh và chỉnh sửa điều đó. Nhưng nó sẽ không giải quyết vấn đề trước mắt của bạn.

Ví dụ, tôi sử dụng vi-like-emacs để phát lệnh ad hoc shell. Nếu những cái đó không yêu cầu thêm đầu vào, nó hoạt động tốt để chạy những cái đó trong một cửa sổ , nắm bắt đầu ra của lệnh - và chỉnh sửa đầu ra khi cần để tinh chỉnh lệnh. Emacs cũng cho phép bạn làm một cái gì đó như thế, cũng như vim.


2

Nếu bạn nhận được thông báo đó trong Ubuntu sau khi chạy lệnh không tồn tại từ bash, hệ thống của bạn có thể đang sử dụng command_not_found_handlechức năng. Bạn có thể thấy nó trong /etc/bash.bashrc.

Một vụ hack tầm thường có thể là một lựa chọn: Tôi vừa tạo một tập lệnh có tên cnfh:

#!/bin/bash

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
        function command_not_found_handle {
                # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
                   /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
                   /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
                else
                   printf "%s: command not found\n" "$1" >&2
                   return 127
                fi
        }
fi


"$@"
RET_VAL=$?
if [ $RET_VAL -eq 127 ]; then
  OUT=$(command_not_found_handle "$@" 2>&1)
  $(echo $OUT |sed -n 's/.*\(apt-get install .\+\)$/\1/p')
fi

Sau đó chạy lệnh td bằng cách sử dụng tập lệnh này:

# ./cnfh td

Sử dụng Ubuntu 14.04.2 LTS . Tôi hy vọng điều đó sẽ giúp.


Điều này trông thực sự thú vị và có lẽ là thứ tôi muốn thêm vào hệ thống của mình. Bạn có thể thêm một số thông tin về cách thức hoạt động? Mã tích hợp để xử lý các hoàn thành và những thứ như thế này là khá khó hiểu.
Joe

2

Trong tmux v2.4 trở đi (kể từ lần cam kết này https://github.com/tmux/tmux/commit/76d6d3641f271be1756e41494960d96714e7ee58 ) với send-keys -X. Nó có thể có thể trong các phiên bản cũ hơn, với một cú pháp khác nhau.

Trong .tmux.conf:

bind ! copy-mode \;\
       send-keys -X cursor-up \;\
       send-keys -X select-line \;\
       send-keys -X cursor-left \;\
       send-keys -X copy-selection-and-cancel \;\
       paste-buffer

Bây giờ, prefix+!sẽ sao chép dòng cuối cùng ở vị trí con trỏ hiện tại.

cursor-left có thể bị bỏ qua nếu bạn muốn thực hiện trực tiếp mà không cần gõ return.

Lưu ý : nó sẽ không hoạt động nếu dòng cuối cùng trống hoặc nếu nó được bọc nhưng nó vẫn hữu ích trong hầu hết các trường hợp


1

Để thực thi dòng đầu ra cuối cùng từ lệnh gần đây nhất, nếu bạn sẵn sàng thực hiện lại lệnh đó (vì nó không làm gì cả ngoại trừ phát ra thông báo chẩn đoán), hãy làm

$($(fc -ln -1) | tail -n 1)

Từng bước (từng lớp):

  • fc (có thể là viết tắt của Lệnh Fix Fix Hướng dẫn) là một lệnh dựng sẵn để truy cập lịch sử lệnh.

    • -ln
      • l(chữ thường L) - l ist lệnh trước
      • n- không bao gồm lệnh n umbers
    • 1 (một) - đề cập đến lệnh gần đây nhất

    fc -ln -1 liệt kê lệnh gần đây nhất, không bao gồm số lệnh.

  • $(fc -ln -1) thực hiện lệnh gần đây nhất.
  • $(fc -ln -1) | tail -n 1thực hiện lệnh gần đây nhất và hiển thị dòng cuối cùng của đầu ra. Đây là sudo apt-get install textdrawdòng, trong ví dụ của bạn.
  • $($(fc -ln -1) | tail -n 1)thực hiện lệnh đó .

Bạn có thể bí danh này:

alias execute_last_line_of_output_from_previous_command='$($(fc -ln -1) | tail -n 1)'

Tôi để nó cho bạn chọn một tên ngắn hơn cho bí danh.

Ghi chú:

  • Này hoạt động chỉ dành cho các lệnh đơn giản - không có ký tự đặc biệt như |, <, >, ;, &, hoặc dấu ngoặc kép chẵn. Nếu bạn cần xử lý các lệnh phức tạp, có thể bạn có thể thực hiện bằng cách thêm một eval, nhưng điều này không được khuyến khích rộng rãi.
  • Nếu bạn cần truy cập vào thứ gì đó không phải là dòng đầu ra cuối cùng (ví dụ: dòng cuối cùng thứ mười bảy đến cuối cùng), bạn có thể làm một cái gì đó tail -n 17 | head -n 1.
  • Nếu bạn cần truy cập một cái gì đó ngoài lệnh gần đây nhất, bạn có thể thay đổi các đối số thành fc. Lưu ý đó fc -ln -1là viết tắt của fc -ln -1 -1. Để lấy lệnh gần đây thứ ba, sử dụng fc -ln -3 -3.
  • Nếu bạn cần sự linh hoạt như trên, có lẽ bạn nên viết một hàm shell lấy các đối số thay vì bí danh.
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.