나는 실패한 명령의 출력이 표준 출력으로 전송되어야 하고 따라서 파이프될 수 있다고 추측합니다. 제가 틀린 것 같으니 정정해 주시기 바랍니다.
예를 들어,
$easy_install
The program 'easy_install' is currently not installed. You can install it by typing:
sudo apt-get install python-setuptools
따라서 제안된 명령을 사용하여 설치하려면 시도했습니다.
$easy_install | grep sudo | bash
즉, 순진하게 마지막 줄을 선택하여 명령으로 셸에 보내려고 합니다. 나는 심지어 시도했다
$easy_install | tail -1 | bash
하지만 똑같은 브리핑을 받아도 아무 소용이 없었습니다. 내가 뭘 잘못했나요?
답변1
문제의 줄은 명령이므로 내가 생각할 수 있는 가장 쉬운 방법은 다음과 같습니다.
`$easy_install 2>&1 | grep sudo`
백틱을 선택하거나 $(…)
명령 파이프의 출력을 가져와 마치 입력한 것처럼 실행하여 출력을 반환합니다.
sudo
이 명령이 누락되어 설치하려고 하면 작동하지 않습니다. 그러나 이것은 분명히 Ubuntu이기 때문에 sudo
일반적으로 사용할 수 있습니다. 이를 방지하려면 두 번째 옵션을 시도해 볼 수 있습니다.
`$easy_install 2>&1 | tail -n 1`
사용을 포기해 보세요 tail -1
. 표준 형식으로 대체되고 있습니다 tail -n 1
. 나는 이것이 어려운 방법이라는 것을 알았지 만 지원 중단 경고가 마음에 들지 않습니다. :)
경고하다: 만약에$easy_install
존재하다다음 명령 중 하나로는 이러한 유형의 출력을 얻을 수 없습니다.많은보안 위험. 결국에는 임의의 작업을 수행할 수 있습니다. 좀 더 럭셔리하게 행동하면 자신을 보호할 수 있습니다.
`$easy_install 2>&1 >/dev/null | grep '^sudo apt-get install'`
이렇게 하면 으로 시작하는 모든 항목이 삭제 stdout
되고 실행 됩니다 sudo apt-get install
. 이는 제한하는 데는 좋지만 sudo apt-get install $package
직접 입력하는 것보다 훨씬 더 짜증납니다.
답변2
오류 출력은 일반적으로 표준 출력이 아닌 표준 오류로 이동합니다. 2>&1
.
$ easy_install 2>&1 | grep sudo
즉, 그들은 이 작업을 수행하기 위해 쉘 함수를 사용하며, 해당 함수를 조금만 변경하면 사용자에게 묻고 자체적으로 실행될 수 있을 것으로 생각됩니다.