때때로 나는 새로운 (우분투) 상자를 만들고 있는데 다음과 같이 타이핑 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) 변경 stderr
에 stdout
. 그것을 편집 파일을 수행 /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py
하고 변화 stderr
에 stdout
라인 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
위의 내용이 잘못되었다는 것을 기꺼이 인정합니다. 나는 echo
bash complete auto suggest 대신 명령 으로 Red Hat 시스템에서 이것을 테스트하고 있지만 원칙은 동일해야합니다.
하루가 끝나면 aptitude install git을 입력하는 것이 더 빠를 것입니다 …