이 스크립트 초반에는 사용자와 사용자의 자격 증명을 변수로 읽어옵니다.
다음 코드는 예상대로 작동하여 mysql 사용자의 자격 증명을 확인합니다.
lu="test"
lp="test-password"
ldb="local_db"
if mysql -u $lu -p"$lp" $ldb -e "quit"; then
printf "true"
return 0;
else
printf "false"
return 1;
fi
이 코드가 실행되면 명령줄에서 비밀번호 사용에 대한 mysql 경고가 인쇄됩니다. mysql 명령의 종료 코드를 평가하는 동안 출력에서 경고를 억제하고 싶습니다.
이것에답변오류 메시지 억제를 사용하는 방법과 관련하여 mysqlcommand 2>&1 | grep -v "Warning: Using a password"
출력에서는 경고만 제거합니다. 다른 모든 출력은 계속 표시됩니다.
나는 그것을 내 코드에 통합하려고 시도했지만 성공하지 못했습니다. 내가 할 수 있는 방법이 있나요?
답변1
예. 문제는 파이프의 종료 상태가 파이프의 마지막 요소의 종료 상태라는 것입니다.
최신 버전의 bash의 경우 PIPESTATUS 배열을 사용하고 쓸 수 있습니다.
mysqlcommand 2>&1 | grep -v ...
if [ ${PIPESTATUS[0]} -eq 0 ] ; then
printf "true\n"
return 0
else
...
더 많은 휴대용 솔루션이 존재합니다. 당신은 실행할 수 있습니다
( mysqlcommand ; echo $? > lastsqlret ;) 2>&1 | grep ...
if grep '^0$' lastsqlret ; then
...
임시 파일을 사용하면 파일 설명자 작업을 사용하여 임시 파일을 피할 수 있습니다.
답변2
파이프의 종료 상태는 항상 마지막 명령의 종료 상태입니다. Bash에서는 설정을 통해 이 동작을 변경할 수 있습니다 set -o pipefail
. 이 옵션을 사용하면 전체 명령은 매뉴얼 페이지에서 마지막으로 발생한 0이 아닌 종료 상태의 종료 상태를 갖게 됩니다.
파이프라인 실패 옵션이 활성화되지 않은 경우 파이프라인의 반환 상태는 마지막 명령의 종료 상태입니다. 파이프라인 실패가 활성화된 경우 파이프라인의 반환 상태는 0이 아닌 상태로 종료된 마지막(가장 오른쪽) 명령의 값이거나 모든 명령이 성공적으로 종료된 경우 0입니다.
예:
#!/bin/bash
false | true
echo "Without pipefail: $?"
set -o pipefail
false | true
echo "With pipefail: $?"
생산:
Without pipefail: 0
With pipefail: 1