Erro ao baixar programas via Shell Script pelo terminal no Ubuntu

Olá!

Gostaria de uma pequena grande ajuda referente a uma parte do código do meu Script de Pós Instalação Pessoal do Ubuntu.

Nota: Não sei Shell Script. Sou apenas um entusiasta de Linux que está aprendendo dia após dia como usar o sistema e suas facilidades.

Estou tentando fazer a automação de instalação de três programas: Amazon Corretto 11, GitHub Desktop - The Linux Fork e Brave Browser.

O erro é que simplesmente as linhas não são interpretadas/executadas. Como faço para que os programas se instalem da mesma maneira como se estivessem sendo baixados manualmente? Se houver outras sugestões, serão muito bem-vindas!

Segue o trecho do meu código:

## Adding Amazon Corretto 11
wget -O- https://apt.corretto.aws/corretto.key | sudo apt-key add - sudo add-apt-repository 'deb https://apt.corretto.aws stable main' -yy

## Adding GitHub Desktop - The Linux Fork
wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo tee /etc/apt/trusted.gpg.d/shiftkey-desktop.asc > /dev/null -yy

sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftky-desktop.list' -yy

## Adding Brave Browser
sudo apt install apt-transport-https curl gnupg -yy

curl -s https://brave-browser-apt-release.s3.brave.com/brave-core.asc | sudo apt-key --keyring /etc/apt/trusted.gpg.d/brave-browser-release.gpg add - -yy

echo "deb [arch=amd64] https://brave-browser-apt-release.s3.brave.com/ stable main" | sudo tee /etc/apt/sources.list.d/brave-browser-release.list -yy

### System Update
sudo apt update -qq &&

#### Installing the Programs
sudo apt install -yy java-common java-11-amazon-corretto-jdk github-desktop brave-browser

Observação: Este trecho do código já consta o !#/bin/bash. Assim como a permissão para o arquivo .sh rodar como programa também já foi concedida. O arquivo é executado corretamente, mas quando chega na parte do código acima, ocorre um erro. Mais informações, acesse o meu repositório clicando aqui.

Espero que possam me ajudar.

Grato desde já!

Não manjo de shell script, mas deu pra perceber algumas coisas lendo os scripts que já rodei. Geralmente eles começam uma linha fazendo referência ao bash:

#!/bin/sh

ou

#!/bin/bash

Coloca no topo do arquivo.

1 curtida

Como o @Francehelder , vc precisa da Shebang, coloque na primeira linha:

#!/usr/bin/env bash
1 curtida

Vou pesquisar sobre isso. Obrigado.

Bota:
#!/bin/bash e dá permissão de execução para o teu script com: chmod 755 nome_do_script.sh

Olá!

Como já mencionei, este é um trecho do código. A referência que você comentou, já está em meu código-fonte.

Olá!

Tais declarações já estão postas no meu código-fonte. Bem como também já dei permissão (chmod 755) ao arquivo .sh para rodar em minha máquina.

Minha dúvida é somente em relação à semântica do código em si.

Olá!

Respondi a esse(a) mesmo(a) comentário/resposta nessa discussão.

Obrigado mesmo assim!

Vai ser preciso mais informação, como por exemplo onde esse script é chamado e como ele se comporta se chamado manualmente, que saída retorna no terminal (uso fedora e não estou com tempo para criar um ambiente para testar o seu código).

Qual o erro?

dando uma olhada mais cuidadosa, tenho quase certeza que o problema está em usar wget e apt-key antes de instalar o mesmo e o gnupg. Mais tarde vou fazer um container e ver.

Recomendo fazer um apt update e instalar todas as dependências básicas antes de continuar o script.

./test.sh: 1: !#/bin/bash: not found
--2020-11-18 12:31:15--  https://apt.corretto.aws/corretto.key
Resolving apt.corretto.aws (apt.corretto.aws)... 13.227.108.5, 13.227.108.51, 13.227.108.37, ...
Connecting to apt.corretto.aws (apt.corretto.aws)|13.227.108.5|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1695 (1,7K) [binary/octet-stream]
Saving to: ‘STDOUT’

-                                         100%[===================================================================================>]   1,66K  --.-KB/s    in 0s      

2020-11-18 12:31:16 (149 MB/s) - written to stdout [1695/1695]

gpg: can't open 'sudo': No such file or directory
gpg: can't open 'add-apt-repository': No such file or directory
gpg: can't open 'deb https://apt.corretto.aws stable main': No such file or directory
gpg: can't open '-yy': No such file or directory
tee: invalid option -- 'y'
Try 'tee --help' for more information.
Reading package lists... Done
Building dependency tree       
Reading state information... Done
gnupg is already the newest version (2.2.19-3ubuntu2).
gnupg set to manually installed.
The following NEW packages will be installed:
  apt-transport-https curl libcurl4
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 396 kB of archives.
After this operation, 1.275 kB of additional disk space will be used.
Get:1 http://br.archive.ubuntu.com/ubuntu focal-updates/universe amd64 apt-transport-https all 2.0.2ubuntu0.1 [1.708 B]
Get:2 http://br.archive.ubuntu.com/ubuntu focal-updates/main amd64 libcurl4 amd64 7.68.0-1ubuntu2.2 [233 kB]
Get:3 http://br.archive.ubuntu.com/ubuntu focal-updates/main amd64 curl amd64 7.68.0-1ubuntu2.2 [161 kB]
Fetched 396 kB in 1s (605 kB/s)   
Selecting previously unselected package apt-transport-https.
(Reading database ... 155418 files and directories currently installed.)
Preparing to unpack .../apt-transport-https_2.0.2ubuntu0.1_all.deb ...
Unpacking apt-transport-https (2.0.2ubuntu0.1) ...
Selecting previously unselected package libcurl4:amd64.
Preparing to unpack .../libcurl4_7.68.0-1ubuntu2.2_amd64.deb ...
Unpacking libcurl4:amd64 (7.68.0-1ubuntu2.2) ...
Selecting previously unselected package curl.
Preparing to unpack .../curl_7.68.0-1ubuntu2.2_amd64.deb ...
Unpacking curl (7.68.0-1ubuntu2.2) ...
Setting up apt-transport-https (2.0.2ubuntu0.1) ...
Setting up libcurl4:amd64 (7.68.0-1ubuntu2.2) ...
Setting up curl (7.68.0-1ubuntu2.2) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for libc-bin (2.31-0ubuntu9.1) ...
gpg: can't open '-yy': No such file or directory
tee: invalid option -- 'y'
Try 'tee --help' for more information.
All packages are up to date.
W: Failed to fetch https://packagecloud.io/shiftkey/desktop/any/dists/any/InRelease  429  Too Many Requests [IP: 54.183.38.243 443]
W: Some index files failed to download. They have been ignored, or old ones used instead.
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package java-11-amazon-corretto-jdk
E: Unable to locate package github-desktop
E: Unable to locate package brave-browser
./test.sh: 20: Syntax error: Unterminated quoted string

Faltou separar essas duas linhas. Daí o apt-key acha que sudo add-apt-repository [...] são chaves/assinaturas digitais para adicionar.

Mesmo problema na linha relativa ao Brave (que começa com curl).

O tee não precisa de -yy (inclusive dá erro porque ele não sabe o que fazer). Só tirar, ele faz/sobrescreve sem problema.

essa linha está invertida ficaria assim => ( #!/bin/bash )

2 curtidas

Erro corrigido em meu repositório. Obrigado! :upside_down_face:

1 curtida

Olá!

Estou feliz em anunciar que consegui fazer o trecho do meu código funcionar. Para aqueles que quiserem ver o resultado, clique aqui.

Obrigado a todos pela contribuição! :blush:

Só uma dica:
Você não precisa usar o “&&” ao final de cada linha.

Usamos isto para liberar o terminal depois de executar um programa ou quando faremos duas execuções na mesma linha…

Para execuções linha a linha, é desnecessário usar.

Outra coisa que podes fazer para se livrar do “sudo” em todos os comandos do script, é simplesmente executar ‘sudo su’ no topo do script.

Fazendo isso, os próximos comandos não precisariam do ‘sudo’ antecedendo-os.
Também é possível checar se o usuário é root, antes da execução…
Tenho dois scripts em meu repositório do github, caso queira, podes observá-los e ver se tem algo que possa lhe ajudar.

Programar em shell é relativamente simples.

3 curtidas

Mais especificamente:

comando &
# Deixa `comando` rodando no fundo e executa o resto do script ao mesmo tempo.
comando1 && comando2
# Executa `comando1` e, se nenhum erro for relatado pelo primeiro, o `comando2`
comando1 ; comando2
# Executa `comando1` e depois o `comando2`, simplesmente. Equivalente a separar o comando em linhas.
4 curtidas

Na linha 37 para que você saiu do bash para usar o sh sendo que o bash também consegue fazer esta tarefa.
Isso só vai deixa a execução milésimos de segundos mais lento e polui o código.
Não e que não possa usar só que não é uma boa pratica.
Você também esta usando -yy use -y esse segundo y esta fazendo nada só atrapalhando a leitura.
O seu código esta bem comentadinho eu gostei… pena que eu tenho dificuldade com o inglês.

1 curtida

O && é para checar se a condicional é verdadeira e caso seja verdadeira a execução continua caso seja falsa a execução para.
Você pode verificar isso usando este comando no terminal:

$ e=1 ; while [[ $e -le 5 ]] ; do echo "ague"; e=$(( $e + 1 )) ; done && echo certo

Você esta confundindo com este sinal & você pode verificar o uso deste sinal com este comando:

$ e=1 ; while [[ $e -le 5 ]] ; do echo "ague"; e=$(( $e + 1 )) ; done & echo certo