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.
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.
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"
}
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
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.
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?