마우스를 사용하지 않고 터미널에서 이전 라인 출력을 신속하게 가져 오는 방법은 무엇입니까?


12

Linux (예 : Ubuntu) 터미널, 마지막 행을 가져 오는 방법이 있습니까? 내가 무작위로 타이핑하고 있다고 가정 해 보겠습니다. td 명령은 내 시스템에 설치되지 않았으므로 다음과 같은 메시지가 표시됩니다. 나는 "지름길"을 달리고 싶다. sudo apt-get install textdraw 빨리.

그러한 도구가 있습니까? 아니면 마우스를 사용하지 않고 마지막 줄을 클립 보드에 복사 할 수 있습니까?

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

위쪽 화살표를 누르십니까? 너 그거 해봤 니? 또한 Linux에서 history 명령을 확인하십시오.이 명령은 잘 작동합니다.
Richie086

터미널 멀티플렉서 프로그램, tmux 및 screen은 텍스트를 클립 보드로 가져 오는 기능을 제공합니다. 그러나 우분투의 기본 GUI에는 더 쉬운 방법이있을 수 있으므로 좀 더 쉬운 대답이 가능할 수도 있습니다. PgUp, Shift-PgUp 또는 Ctrl-PgUp을 누르면 스크롤 백이 허용됩니다.
TOOGAM

3
@ Richie086 참고 : 필요한 것은 무엇입니까? sudo apt-get install textdraw, 아니라 td. 위쪽 화살표는 단지 ​​나에게 줄 것이다. td
Daniel

답변:


6

조금 외설스럽지 않더라도 (나는 그렇지 않습니다.), 당신은 씨발 , 당신이 요구 한 것을 정확하게 수행하는 도구.

음, 정확하지는 않지만 같은 문제를 해결합니다. 최신 행을 가져 오는 대신 입력 한 마지막 명령과 일치 시키려고 시도합니다.

Fuck은 이전 명령에 대한 규칙을 일치 시키려고 시도하고, 일치 된 규칙을 사용하여 새 명령을 작성하여 실행합니다.

저장소에 표시된 예는 언급 한 여러 시나리오를 표시합니다.

enter image description here


2

짧은 대답 : 아니, 아마도 당신은 이것을 할 수있는 방법이 없습니다.

긴 대답 :

  • 그것이있는 동안 가능한 원하지 않는 프로그램이 키보드 항목을 스누핑 할 수 있다는 우려로 실제로는 화면 내용을 읽어 들이고 편집 할 수있는 터미널 에뮬레이터가 있어야합니다.
  • 껍질 할 수 있었다 명령 출력을 캡쳐하고 명령을 편집 할 수 있도록 설계하십시오 (명령 내역과 동일). 명령이 뭔가라면 복잡해 질거야. vi (여기서 출력은 좋은 줄 중심의 텍스트가 아닙니다). bash는 그렇게하지 않습니다. 어쨌든.

실제로 사람들이이 제한을 해결하기 위해 수행하는 작업은 명령 출력을 캡처하고 편집하는 다른 프로그램을 사용하는 것입니다. 그러나 그것은 당신의 즉각적인 문제를 해결하지 못할 것입니다.

예를 들어, 나는 vi-like-emacs ad hoc 쉘 명령을 실행합니다. 추가 입력이 필요하지 않은 경우 창문 명령 출력을 캡쳐하고 필요에 따라 출력을 편집하여 명령을 구체화합니다. Emacs는 또한 vim과 같은 것을 할 수있게 해준다.


2

bash에서 존재하지 않는 명령을 실행 한 후 우분투에서 해당 메시지를 얻은 경우 시스템에서 아마도 command_not_found_handle 기능. 에서 볼 수 있습니다. /etc/bash.bashrc.

사소한 해킹이 옵션 일 수 있습니다. 방금 만든 스크립트를 만들었습니다. 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

그런 다음이 스크립트를 사용하여 td 명령을 실행하십시오.

# ./cnfh td

사용 우분투 14.04.2 LTS . 도움이되기를 바랍니다.


이것은 정말 멋지게 보일 수도 있고 내 시스템에 추가하고 싶은 무언가 일 수도 있습니다. 어떻게 작동하는지에 대한 정보를 추가 할 수 있습니까? 완료 및 이와 같은 작업을 처리하는 내장 코드는 이해하기가 쉽지 않습니다.
Joe

2

tmux v2.4 및 이후 (이 커밋 이후 https://github.com/tmux/tmux/commit/76d6d3641f271be1756e41494960d96714e7ee58 )와 send-keys -X. 이전 버전에서는 다른 구문으로 가능할 수 있습니다.

에서 .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

지금, prefix+! 현재 커서 위치의 마지막 행을 복사합니다.

cursor-left return을 입력하지 않고 직접 실행하려면 생략 할 수 있습니다.

노트 : 마지막 줄이 비어 있거나 줄 바꿈 된 경우 작동하지 않지만 대부분의 경우 여전히 유용합니다.


0

가장 최근의 명령으로부터 최종 출력 행을 실행하려면, 해당 명령을 다시 실행하려는 경우 (진단 메시지를 발행하는 것 외에는 아무것도하지 않았기 때문에), do

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

단계별 (단계별) :

  • fc ( "수정 명령"을 의미 할 수도 있음) 명령 내역에 액세스하기위한 쉘 내장 명령입니다.

    • -ln
      • l (소문자 L) - ist 이전 명령
      • n - 명령을 포함하지 않습니다. 웅덩이
    • 1 (하나) - 가장 최근의 명령을 나타냄

    fc -ln -1 명령 번호를 포함하지 않고 가장 최근의 명령을 나열합니다.

  • $(fc -ln -1) 실행하다 가장 최근의 명령.
  • $(fc -ln -1) | tail -n 1 가장 최근 명령을 실행합니다. 출력의 마지막 행을 표시합니다. 이것이 sudo apt-get install textdraw 귀하의 예를 들어, 라인.
  • $($(fc -ln -1) | tail -n 1) 실행하다 명령.

다음과 같이 별칭을 지정할 수 있습니다.

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

별칭에 대해 더 짧은 이름을 선택하도록 남겨 둡니다.

노트:

  • 이것은 간단한 명령에서만 작동합니다. 특별한 문자가 없습니다. |, <, >, ;, &또는 따옴표. 복잡한 명령을 처리해야하는 경우, 당신은 아마 그것을 추가함으로써 할 수 있습니다. eval, 그러나 이것은 널리 권장되지 않습니다.
  • 마지막 출력 줄 이외의 항목에 액세스해야하는 경우 (예 : 마지막 열의 17 번째 행), 너는 뭔가 할 수있어. tail -n 17 | head -n 1.
  • 가장 최근의 명령이 아닌 다른 명령에 액세스해야하는 경우, 인수를 변경할 수 있습니다. fc. 유의 사항 fc -ln -1 짧다 fc -ln -1 -1. 가장 최근에 세 번째 명령을 검색하려면 다음을 사용하십시오. fc -ln -3 -3.
  • 위와 같이 유연성이 필요한 경우, 인수를 취하는 쉘 함수를 써야합니다. 별칭이 아니라 오히려 별칭입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.