Shell script de instalação do Discord via flatpak não funciona

Olá, pessoal! Eu com problemas com o meu shell script de instalação do Discord por meio do flatpak no popOS 22.04 LTS.

Eu não sei se é algum problema lógico do código na parte do if/else, apesar de não concordar com isso, uma vez que esse script funciona para outros pacotes flatpak. Por outro lado, eu penso que deve ser algum pormenor no comando grep que ele está “enxergando” um com.discordapp.Discord na lista dos pacotes flatpak.

Segue o código:

function flatpak_add() {
  app="$1"
  sudo flatpak install -y flathub $app --system &>>./log.txt
}

function install_flatpak_apps() {
  package="com.discordapp.Discord"
  if ! flatpak list --columns=application | grep -q "\b${package}\b"; then
    printf "[TASK] - Installing ${ORANGE}$package...\n"
    flatpak_add $package

    if flatpak list --columns=application | grep -q "\b${package}\b"; then
      printf "[SUCCESS] - package $package was installed successfully!\n"
    else
      printf "[ERROR] - package $package was not installed successfully!\n"
    fi

  else
    printf "[INFO] - flatpak package $package is already installed!\n"
  fi

}

install_flatpak_apps

Se eu tento instalar na “mão” o Discord, dá tudo certo. Estranho, não? Desse modo, segue a saída do terminal:

PS.: já tentei os respectivos comandos sudo flatpak repair, sudo flatpak repair --reinstall-all e flatpak repair --user a fim de ter certeza se poderia ser alguma questão do flatpak.

Olá :vulcan_salute:

Eu não entendo muito de shell script ou programação, mas, quanto a como usar Flatpak, o parâmetro --system é desncessário, a não ser que haja mais de um repositório ou algo do tipo, aliás, recomendo utilizar como user ao invés de system.

Para isso, remova o repositório com esse comando: flatpak remote-delete flathub
E adicione o Flathub novamente:
flatpak remote-add --user flathub https://flathub.org/repo/flathub.flatpakrepo

Assim, a pasta de instalação mudará de /var/lib/flatpak para $HOME/.local/share/flatpak, você não precisará colocar senha para instalar e poderá modificar os arquivos quando quiser pois estão na sua home, sem dizer que se usa a home separada não precisará instalar tudo de novo numa nova instalação. Pra mim, só há vantanges.

Para saber quantos repositórios tem adicionados, use o comando flatpak remotes.

1 curtida

Opa, de boa, @kevinlucasilva? Vou testar sua solução trocando a opção --system por --user. Ademais, eu estava utilizando essa primeira opção pois buscava uma solução para o Debian devido ao super usuário (root), senão os pacotes flatpak ficariam instalados apenas para o root.

Se tiver curiosidade, aqui está o repositório original desse script da minha pergunta do fórum: Linux workstation.

Então, se você adicionar qualquer repositório sem nenhum parâmentro adicional, ele sempre ser adicionado como system (--system). Eu não curto usar assim, pois há coisas que preciso modificar, tanto os apps quanto runtimes, enfim, é só usar o parâmetro e voilà.

Já no seu script, mude de:
sudo flatpak install -y flathub $app --system &>>./log.txt
Para:
flatpak install -y $app &>>./log.txt

Pois, se readicionou o Flathub como --user, não precisará de SUDO; e se você só te 1 repositório que é o Flathub ou o Discord está apenas disponível no mesmo, não há necessidade de especificar no comando o repositório em que deseja instalar o app.

Na verdade é um erro de sintaxe (alguns na verdade)

A sintaxe do if é essa:

if [ "valor1" operador "valor2" ] ; then

Para negar o operador:

if [ ! "valor1" operador "valor2" ] ; then

O Bash não tá conseguindo entender o que você quer fazer basicamente, você pode resolver isso de duas, formas, a primeira é você tirar o comando do teste do if:

function install_flatpak_apps() {
  package="com.discordapp.Discord"
  flatpak list --columns=application | grep -q "\b${package}\b"

  #  O Bash armazena o último código de saída em ${?}
  if [ ! "${?}" = "0" ] ; then
    printf "[TASK] - Installing ${ORANGE}${package}...\n"
    flatpak_add ${package}

    flatpak list --columns=application | grep -q "\b${package}\b"; 

    if [ "${?}" = "0" ] then
      printf "[SUCCESS] - package ${package} was installed successfully"'!'"\n"
    else
      printf "[ERROR] - package ${package was} not installed successfully"'!'"\n"
    fi

  else
    printf "[INFO] - flatpak package ${package} is already installed"'!'"\n"
  fi

}

# Lembre-se de chavear as variáveis e principalmente:
# nunca use ! Dentro de " e " no bash, sempre coloque "'!'"
# no lugar

Ou transformar todas as suas chamadas em blocos test essa é a que deixa o código mais limpo:

function install_flatpak_apps() {
  package="com.discordapp.Discord"
  
  #Vamos retirar o else, não precisamos dele se sairmos caso o app já esteja instalado
  
  flatpak list --columns=application | grep -q "\b${package}\b" && {
    printf "[INFO] - flatpak package $package is already installed"'!'"\n"
    return 0
  }
  
  printf "[TASK] - Installing ${ORANGE}$package...\n"
  
  flatpak_add $package

  flatpak list --columns=application | grep -q "\b${package}\b" && {
      printf "[SUCCESS] - package $package was installed successfully"'!'"\n"
      return 0
  }
  
  # De novo, retiramos o else, o return corta a execução da função
  printf "[ERROR] - package $package was not installed successfully"'!'"\n"
}
1 curtida

Sobre está parte, tem algumas recomendações sobre evitar o uso deste tipo de abordagem. Segue um vídeo…

1 curtida

Eu estou ciente, mas eu não gosto de mexer na estrutura do código, a questão é que ele tá usando um pipe então adicionaria uma complexidade desnecessária, assim, pra essa situação o próprio if é desnecessário

1 curtida

Oi, @Natanael.755! Infelizmente, suas duas soluções não funcionaram para mim. Penso que o problema está nesto trecho de código flatpak list --columns=application | grep -q "\b${package}\b", uma vez que o comando grep entende que existe o pacote flatpak com.discordapp.Discord previamente instalado.

Aliás, segue a saída do terminal:

PS.: O script test.sh correspondo à primeira solução que foi dada e o script test2.sh, por conseguinte, a segunda.

Testei rapidamente, o script abaixo e funcionou perfeitamente.

function flatpak_add_app() {
    local app="$1"
    if flatpak list --columns=app | grep -q "\b${app}\b" ; then
        echo Package already installed
        return 0
    fi
    echo Installing $app
    flatpak install flathub -y "$app" >> log.txt
}

function flatpak_install_app(){
    local package="com.discordapp.Discord"
    if ! flatpak list --columns=app | grep -q "\b${package}\b" ; then
        flatpak_add_app "$package"
    else
        echo Package already installed
    fi
}

flatpak_install_app

Galera, eu acabei de testar o meu script (aquele que postei na minha pergunta) e ele funcionou em a VM com o popOS 22.04 LTS (o mesmo da minha máquina host), ou seja, o problema não está no código shell, mas sim no flatpak.

Isso faz sentido, pois tempos atrás desinstalei pacotes do flatpak (e ele próprio) de modo incorreto. Agora, estou sofrendo por esse “pecado”, digamos assim. Entretanto, penso que ainda não fecharei este tópico, porque é preciso resolver a questão, certo?