O sistema operacional em questão é o Fedora 40.
Gostaria de criar um diretório e baixar um arquivo para ele, então escrevi este script simples
#!/bin/bash
set -eu -o pipefail
sudo -n true
test $? -eq 0 || exit 1
curlpackages="$HOME/curl-packages"
mkdir -p $curlpackages
curl --output-dir $curlpackages -JLO <someaddress>
Eu esperaria que o diretório e o arquivo estivessem em , /home/myname/
mas em vez disso eu recebo /root/
. Isso é porque eu executo isso com sudo
? Se sim, posso usar outra variável em vez de $HOME
apontar para minha pasta home em vez de root?
sim
Por que não colocar o comando sudo dentro do script - apenas para os comandos que precisam ser executados como root, em vez de executar o script inteiro como root:
Observe que, por exemplo,
sudo echo $HOME
imprimirá o diretório inicial esperado - porque a expansão dessa variável acontece antes do comando ser executado.Para esclarecer alguma confusão que Nickotine tem nos comentários sobre esta resposta:
Você pode usar
$SUDO_USER
Manual do Sudo
Identificar usuário em um script Bash chamado por sudo
SUDO_USER está documentado em man sudo
Você terá que especificar seu usuário assim, já que você é root:
curlpackages='/home/<yourUser>/curl-packages'
Embora o
sudo
comando que você tem no seu script apenas verifique se o usuário tem permissões para usar osudo
comando.sudo -i
ousu
?exit
execute o script como:sudo bash script.bash
sudo -n true
não permitirá que o script seja executado por usuários sem permissões sudoAqui está o que quero dizer, algumas melhorias no seu código:
eval
, uma variável extra, e ter que usar substituição de comando ou$()
que inicia um sub-shell, e pode levar a efeitos colaterais indesejadoseval