실패한 명령의 출력에 대해 조치를 취하는 방법

실패한 명령의 출력에 대해 조치를 취하는 방법

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

나는 실패한 명령의 출력이 표준 출력으로 전송되어야 하고 따라서 파이프될 수 있다고 추측합니다. 제가 틀린 것 같으니 정정해 주시기 바랍니다.

예를 들어,

$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

즉, 그들은 이 작업을 수행하기 위해 쉘 함수를 사용하며, 해당 함수를 조금만 변경하면 사용자에게 묻고 자체적으로 실행될 수 있을 것으로 생각됩니다.

관련 정보