명령줄에서 tail의 텍스트를 실행하는 가장 쉬운 방법은 무엇입니까?

명령줄에서 tail의 텍스트를 실행하는 가장 쉬운 방법은 무엇입니까?

때때로 나는 새로운 (우분투) 상자에서 작업하고 있는데 다음을 입력하고 git경고를 받습니다:

The program 'git' is currently not installed.  You can install it by typing:
apt-get install git-core

그런 일이 발생하면 다음과 같이 하여 마지막 줄을 잡을 수 있다는 것을 알고 있습니다.

!! 2>&1 | tail -n 1

그런데 어떻게 하면 그 ( )의 결과를 apt-get install git-core가장 쉽게 실행할 수 있을까요?

나는 내가 할 수 있다는 것을 깨닫는다

`!! 2>&1 | tail -n 1`

하지만 실제로 출력을 파이프하여 실행하는 방법도 있습니까? 이것은 작동하지 않는 것 같습니다:

!! 2>&1 | tail -n 1 | sh

그리고 그 2>&1부분이 조금 번거롭기 때문에 더 쉽게 할 수 있는 방법이 있는지 궁금합니다.

편집하다

이를 어떻게든 변수에 저장한 다음 변수를 실행하는 것도 허용됩니다.

!! 2>&1 | tail -n 1 | (store as $mycmd)
$mycmd

stdout그러나 적어도 변수가 명령의 오른쪽에 있는 경우에는 변수에 파이프하는 방법을 잘 모르겠습니다 .

답변1

시스템에 존재하지 않는 명령을 입력하면 bash는 function 을 실행합니다 command_not_found_handle(). 이 함수에는 메시지를 인쇄하는 스크립트에 대한 호출이 있습니다 /usr/lib/command-not-found.

우분투 12.04

stdout내 첫 번째 추측은 메시지를 대신 인쇄하기 위해 이 스크립트의 소스를 변경하는 것이 stderr었지만, 스크립트 소스를 읽을 때 누락된 패키지를 설치할 것인지 묻도록 구성할 수 있다는 것을 발견했습니다.

변수를 내보내면 COMMAND_NOT_FOUND_INSTALL_PROMPT누락된 패키지를 설치하라는 메시지가 표시됩니다.

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ export COMMAND_NOT_FOUND_INSTALL_PROMPT=""
pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
Do you want to install it? (N/y)y
sudo apt-get install git
[sudo] password for pbm: 

이전 버전의 우분투

안타깝게도 그런 방법이 없으므로 COMMAND_NOT_FOUND_INSTALL_PROMPT몇 가지 다른 옵션을 찾을 수 있습니다.

1) 12.04부터 패키지를 설치합니다. 문제가 되지 않습니다. Python의 스크립트가 거의 없으므로 작동해야 합니다(테스트되지 않음!).

2) stderr로 변경합니다 stdout. 이를 수행하려면 파일을 편집 하고 237행과 240행에서 로 /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py변경하십시오 .stderrstdout

그 후에는 다음과 같은 방법으로 사용할 수 있습니다.

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ `git`
//Installation begins

-y237행과 240행의 명령 에 옵션을 추가하면 apt-get구문을 사용할 수도 있습니다 !! | sh.

3) 다음과 같은 방법으로 242행에서 이 스크립트를 수정할 수도 있습니다.

print >> sys.stderr, _("You can install it by typing:")
f = open("%s/.install-missing" % os.path.expanduser('~'),'w')
print >> sys.stderr, "sudo apt-get install %s" % packages[0][0]
print >> f, "sudo apt-get install %s" % packages[0][0]
f.close()

이런 방식으로 명령을 file 로 가져오므 ~/.install-missing로 별칭을 만들 수 있습니다.

alias im="chmod +x ~/.install-missing; ~/.install-missing"

호출하면 im패키지가 설치됩니다.

답변2

당신은 다음과 같이 올바른 길을 가고 있었습니다:

!! 2>&1 | tail -n 1 | sh

...하지만 할 수 있는 옵션이 없습니다.. 고려하다:

!! 2>&1 | tail -n 1 | sh -s

apt-get을 실행하려면 루트 액세스가 필요할 수 있으므로 다음을 고려하십시오.

!! 2>&1 | tail -n 1 | sudo sh -s

답변3

다음과 같이 할 수 있습니다:

!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd

대화형 프로그램은 이 경우 입력 'Y'를 예상하기 때문에 파이핑과 잘 작동하지 않는 것 같지만, 첫 번째 명령이 끝나자마자 stdin 파일 설명자는 닫힙니다.

답변4

변수 eval와 명령 대체를 사용할 수 있다고 생각합니다(이 모든 것이 얼마나 안전한지는 잘 모르겠지만).

TEST_VAR=$(!! 2>&1 | tail -n 1); eval $TEST_VAR

나는 위의 내용이 틀렸다는 것을 증명할 의향이 있습니다. 나는 bash 완료 자동 제안 대신 명령을 사용하여 Red Hat 시스템에서 이것을 테스트하고 있지만 echo원칙은 동일해야 합니다.

결국에는 aptitude install git을 입력하는 것이 더 빠를 것입니다.

관련 정보