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

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

때로는 새로운(우분투) 상자에서 개발 중인데 다음을 입력하면 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는 시스템에 존재하지 않는 명령을 입력하면 기능을 실행합니다 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

237 및 240행의 -y명령에 옵션을 추가하는 경우 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()

~/.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을 입력하는 것이 더 빠릅니다.

관련 정보