
나는 실행에 실패한 명령의 출력이 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
즉, 그들은 이를 수행하기 위해 쉘 기능을 사용하고 있으며 해당 기능을 약간 변경하면 사용자에게 묻고 자체적으로 수행할 수 있을 것으로 생각됩니다.