때로는 새로운(우분투) 상자에서 개발 중인데 다음을 입력하면 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
변경합니다 .stderr
stdout
이후에는 다음과 같이 사용할 수 있습니다.
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을 입력하는 것이 더 빠릅니다.