명령 행에서 꼬리에서 텍스트를 실행하는 가장 쉬운 방법은 무엇입니까? 있는데 다음과 같이 타이핑

때때로 나는 새로운 (우분투) 상자를 만들고 있는데 다음과 같이 타이핑 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적어도 변수가 명령의 오른쪽에있는 것은 아니지만 변수 에 파이프하는 방법을 알지 못합니다 .



답변

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

우분투 12.04

이 스크립트의 변경 소스에 나의 첫번째 추측은 메시지를 인쇄하는 stdout대신 stderr,하지만 스크립트 I의 내가 읽고 있던 소스를 사용하면 패키지 누락 설치하려면 그냥 물어 구성 할 수 있음을 발견했다.

변수를 내 보내면 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에서 패키지를 설치하십시오-문제가되지 않아야합니다-파이썬에는 스크립트가 거의 없으므로 작동하지 않아야합니다!

2) 변경 stderrstdout. 그것을 편집 파일을 수행 /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py하고 변화 stderrstdout라인 237 및 240에.

그 후 다음과 같이 사용할 수 있습니다.

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()

이런 식으로 file 명령을 얻을 수 ~/.install-missing있으므로 alias를 만들 수 있습니다.

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

전화하면 im패키지가 설치됩니다.


답변

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

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

…하지만 sh 옵션이 없습니다 . 치다:

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

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

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


답변

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

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

대화식 프로그램은이 경우 입력 ‘Y’가 필요하기 때문에 파이핑에서 제대로 작동하지 않는 것 같지만 stdin 파일 설명자는 첫 번째 명령이 완료 되 자마자 닫힙니다.


답변

변수 eval와 명령 대체를 사용할 수 있습니다 (이 모든 것이 얼마나 안전한지 확실하지는 않지만).

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

위의 내용이 잘못되었다는 것을 기꺼이 인정합니다. 나는 echobash complete auto suggest 대신 명령 으로 Red Hat 시스템에서 이것을 테스트하고 있지만 원칙은 동일해야합니다.

하루가 끝나면 aptitude install git을 입력하는 것이 더 빠를 것입니다 …


답변