2

Я пытаюсь написать сценарий, который принимает в качестве аргументов один или несколько файлов и транспонирует буквы верхнего регистра в буквы нижнего регистра. Содержимое исходного файла заменяется только на нижний регистр.

Файл, указанный в аргументах, должен существовать, он должен быть обычным файлом, он должен быть разрешен для чтения / записи, и он не может быть разрешен при выполнении или быть пустым.

# 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

Моя проблема в том, что когда я выполняю скрипт в обычной оболочке (не root), я получаю следующую ошибку:

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

Вот результат ls -ld /tmp:

drwxrwxrwt. 12 root root 380 May 14 18:35 /tmp

1 ответ1

3

Я не знаю, какая строка 45, но строка $($ficTemp > $param) неверна и, вероятно, выдаст эту ошибку: он пытается выполнить временный файл как скрипт и записать свой вывод в $param , а затем выполнить возвращенная строка.

Есть две очевидные вещи неправильно:

  1. Если у вас нет необычного umask вы не сделали исполняемый временный файл, следовательно, ошибка.
  2. Вывод скрипта перенаправляется, поэтому ничего не будет возвращено, а $() не имеет смысла.

Что ты пытаешься сделать? Если вы хотите скопировать временный файл поверх оригинала, то любое из следующих действий сделает это:

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

Последний из них более эффективен, поскольку ему не требуется доступ к данным, и он одновременно удаляет временный файл, но первоначальный владелец и права доступа заменяются (спасибо G-Man за указание на это).

Что бы вы ни делали, вы должны использовать "$param" , чтобы разрешить встраивать пробелы в имя файла или путь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .