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

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

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

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

예를 들어,

$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

즉, 그들은 이를 수행하기 위해 쉘 기능을 사용하고 있으며 해당 기능을 약간 변경하면 사용자에게 묻고 자체적으로 수행할 수 있을 것으로 생각됩니다.

관련 정보