Use o código de saída e saída de um comando mysql em uma instrução if

0

No início deste script, os usuários e suas credenciais são lidos em variáveis.

O código a seguir funciona como pretendido para verificar as credenciais de um usuário 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

Quando este código é executado, ele exibe o aviso mysql sobre o uso de senhas na linha de comando. Eu gostaria de suprimir esse aviso da saída enquanto ainda avaliava o código de saída do comando mysql.

Nesta resposta sobre como suprimir a mensagem de erro usando mysqlcommand 2>&1 | grep -v "Warning: Using a password" , a saída é despojada apenas do Aviso. Todas as outras saídas ainda são exibidas.

Eu tentei integrar isso no meu código sem sucesso. Existe uma maneira de fazer isso?

    
por dimmech 19.10.2017 / 03:07

2 respostas

1

Sim. O problema que você tem é que o status de saída de um pipeline é o status de saída do último elemento no pipeline.

Para versões recentes do bash, você pode usar o array PIPESTATUS e escrever

mysqlcommand 2>&1 | grep -v ...
if [ ${PIPESTATUS[0]} -eq 0 ] ; then
    printf "true\n"
    return 0
 else
 ...

Mais soluções portáteis existem. Você pode correr

( mysqlcommand ; echo $? > lastsqlret ;) 2>&1 | grep ...
if grep '^0$' lastsqlret ; then
...

usando um arquivo temporário e você pode evitar o arquivo temporário usando a manipulação do descritor de arquivo.

    
por 19.10.2017 / 03:53
0

O status de saída de um pipe é sempre o status de saída do último comando. No bash você pode alterar esse comportamento definindo set -o pipefail . Com essa opção, o comando inteiro terá o status de saída do último status de saída diferente de zero encontrado na página man:

The return status of a pipeline is the exit status of the last command, unless the pipefail option is enabled. If pipefail is enabled, the pipeline's return status is the value of the last (rightmost) command to exit with a non-zero status, or zero if all commands exit successfully.

Exemplo:

#!/bin/bash

false | true
echo "Without pipefail: $?"

set -o pipefail
false | true
echo "With pipefail: $?"

Produz:

Without pipefail: 0
With pipefail: 1
    
por 23.05.2018 / 15:24