나는 많은 외부 명령을 실행하는 BASH 코드를 작성했습니다(부작용 발생). 따라서 개발 및 디버깅 목적으로 명령을 실행하거나 인쇄할 수 있도록 실행을 셸 함수로 래핑하고 싶습니다.
따라서 기본 코드는 다음과 같습니다.
run()
{
if [ "$print_commands" -ne 0 ]; then
echo "$@"
else
"$@"
fi
}
> /dev/null
안타깝게도 대부분의 외부 명령은 성공 시 "성공"과 같은 내용을 출력하므로 저는 이러한 출력의 리디렉션을 사용해 왔습니다 . 그러나 일부 상태 쿼리가 있습니다.하다출력 상태이며 폐기할 수 없습니다.
그러니 분명히 나는할 수 없다> /dev/null
내부에 추가했습니다 run
. 또한 두 번째 리디렉션 기능을 추가하여 대부분의 코드를 복제하고 싶지 않습니다.
나는 이 솔루션을 시도했습니다.
silence='>/dev/null'
run some_command with params $silence
silence
아이디어는 명령을 인쇄할 때 빈 문자열로 설정하는 것인데, 이는 작동하지만 명령을 실행할 때 다음과 같은 결과를 얻습니다.
오류: 인식할 수 없는 인수: >/dev/null
사용되지 않는 중간 정도의 우아한 솔루션이 있습니까 eval
?
답변1
함수의 다른 변수를 확인 run
하고 이를 사용하여 리디렉션을 결정하는 것은 어떨까요?
run()
{
if [ "$print_commands" -ne 0 ]; then
echo "$@"
elif [ "$silence" -ne 0 ]; then
"$@" > /dev/null
else
"$@"
fi
}
그 다음에:
silence=1 run some_command with params whose output is not needed
silence=0 run some_command with params whose output is needed
또는 stdout 대신 stderr로 명령을 출력할 수 있습니다.
run()
{
if [ "$print_commands" -ne 0 ]; then
echo "$@" >&2
else
"$@"
fi
}
답변2
기반으로https://unix.stackexchange.com/a/726123/320598run
리디렉션을 제어하기 위해 추가 첫 번째 매개변수를 추가하기로 결정했습니다 /dev/null
.
run()
{
declare silence="$1"; shift
if [ "$print_commands" -ne 0 ]; then
echo "$@"
elif [ "$silence" -ne 0 ]; then
"$@" > /dev/null
else
"$@"
fi
}
run 0 non_redirected_command params
run 1 redirected_command params