Permissão negada ao tentar ler o arquivo temporário criado no bash

2

Estou tentando escrever um script que aceita como argumentos um ou mais arquivos e transpõe as letras maiúsculas para minúsculas. O conteúdo do arquivo original é substituído pelo conteúdo apenas em minúsculas.

Um arquivo dado em argumentos tem que existir, tem que ser um arquivo normal, deve ser permitido em leitura / escrita e não pode ser permitido em execução nem estar vazio.

# We assume the current file is valid.
declare valide="true"

if (("$#" < 1)) ; then
   # Error, you must enter at least one parameter.
   echo -e "Erreur. Vous devez entrer au moins un parametre."
fi

for param in "$@" ; do

   if [ ! -e $param ] ; then
      $valide="false"
   elif [ ! -f $param ] ; then
      $valide="false"
   elif [ ! -r $param ] ; then
      $valide="false"
   elif [ ! -w $param ] ; then
      $valide="false"
   elif [ -x $param ] ; then
      $valide="false"
   elif [ -s $param ] ; then
      $valide="false"
   fi

   if [ $valide=="true" ] ; then
      # Create temporary file.

      ficTemp=$(/usr/bin/mktemp)

      $(tr '[:upper:]' '[:lower:]' < $param > $ficTemp)
      $($ficTemp > $param)
   else
      # Error, the file $param is invalid for this script.

      echo -e "Erreur. Le fichier $param est invalide pour ce script."
   fi

done

Meu problema é que, quando executo o script em um shell normal (não no root), recebo o seguinte erro:

line 45: /tmp/tmp.xxx: Permission denied

Aqui está o resultado de um ls -ld / tmp:

drwxrwxrwt. 12 root root 380 May 14 18:35 /tmp
    
por bestinthewest 15.05.2016 / 01:38

1 resposta

3

Eu não sei qual linha 45 é, mas a linha $($ficTemp > $param) está errada e provavelmente daria este erro: ela tenta executar o arquivo temporário como um script e escreve sua saída em $param , então executa o comando string retornada.

Existem duas coisas óbvias erradas: -

  1. A menos que você tenha um umask incomum, você não tornou o arquivo temporário executável, daí o erro.
  2. A saída do script é redirecionada, portanto, nunca haverá retorno de nada, e o $() não serve para nada.

O que você está tentando fazer? Se você quiser copiar o arquivo temporário de volta para o original, qualquer um dos itens a seguir fará isso: -

cat $ficTemp > "$param"
cp $ficTemp "$param"
mv $ficTemp "$param"

O último deles é mais eficiente, porque não precisa acessar os dados e remove o arquivo temporário ao mesmo tempo, mas o proprietário original e as permissões de acesso são substituídas (graças ao G-Man por apontar isso ).

O que você fizer, você deve usar "$param" , para permitir espaços incorporados no nome ou no caminho do arquivo.

    
por 15.05.2016 / 03:41