Verificando e alterando a permissão de arquivo com script

4

Eu sou novo no bash e não consigo fazer um script funcionar. Este é o código que eu tenho:

#!/bin/bash
file=~/scripts/text.txt

if [ -e $file ]
then echo "The file exists"

elif [ ! -e $file ]
then echo "The file does NOT exist"

fi

sleep 1s

if [ ! -w $file ]
then { sudo chmod u+w $file; } && { echo "The file is now writable"; }

elif [ -w $file ]
then echo "The file is already writable"
fi

A parte superior do script, que verifica se o arquivo existe, funciona bem. A parte inferior, que verifica se o arquivo é gravável, funciona parcialmente. Isso irá alterar as permissões do arquivo. Mas depois disso, com as permissões de gravação ativadas, ele continuará ecoando "O arquivo agora pode ser gravado" em vez de "O arquivo já está gravável"

Como eu disse, sou novo no bash, então qualquer ajuda seria apreciada. Por favor, mantenha-a simples, porque se as declarações são tão complexas quanto eu posso ir com o meu conhecimento atual.

    
por Andrew 05.08.2013 / 20:54

2 respostas

3

É estranho que você esteja usando sudo para alterar as permissões no arquivo, mesmo que ele esteja em seu diretório pessoal. O arquivo pertence a você? chmod u+w apenas concede permissão de gravação ao proprietário do arquivo. Se você é o dono, não precisa de sudo. Se você não for o proprietário, precisará de sudo , mas chmod u+w apenas concederá permissão de gravação ao proprietário, não lhe concedendo permissão para gravar no arquivo. Então, depois de executar chmod u+w , o arquivo ainda não pode ser gravado por você, que é o que [ -w … ] testa.

Execute ls -l ~/scripts/text.txt para verificar a propriedade e as permissões no arquivo.

Além disso, sempre coloque aspas duplas em torno das substituições de variáveis. (Ou você pode aprender todas as regras e criar seu script Difícil de manter por pessoas que não conhecem todas as regras.) Irritantemente, $file na sintaxe da shell não significa “pegar o valor da variável file ”, isso significa “pegar o valor da variável file , analise-a como uma lista de padrões de curingas e substitua cada padrão pela lista de arquivos correspondentes, se houver arquivos correspondentes ”. Esse material extra é desativado se a substituição ocorrer entre aspas duplas: "$file" significa "pegue o valor da variável file ".

Além disso, você não precisa de todas essas chaves.

if [ ! -w "$file" ]
then
  sudo chmod u+w "$file" && echo "The file is now writable"
elif [ -w "$file" ]
then
  echo "The file is already writable"
fi

Como [ -w "$file" ] é a negação de [ ! -w "$file" ] , o teste elif será sempre bem-sucedido se for atingido. (A menos que haja uma condição de corrida, caso em que o teste elif que testa a mesma condição novamente pode retornar um resultado diferente, o que é ruim.) Assim, você pode e deve simplificar isso para

if [ ! -w "$file" ]
then
  sudo chmod u+w "$file" && echo "The file is now writable"
else
  echo "The file is already writable"
fi
    
por 06.08.2013 / 03:30
2

Você está perdendo uma citação.

echo "The file is now writable;

deve ser

echo "The file is now writable";

Agora que você corrigiu isso, acho que só está alterando permissões para root (não está 100% familiarizado com o esquema de permissões alfabéticas), pois u representa o proprietário, que é root .

Você pode tentar usar a ou o , agora fazendo a linha

then { sudo chmod a+w $file; } && { echo "The file is now writable"; }

Itens adicionais: Você pode querer exit 1 quando o arquivo não existir.

    
por 05.08.2013 / 21:07