É 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