尝试读取在 bash 中创建的临时文件时权限被拒绝

尝试读取在 bash 中创建的临时文件时权限被拒绝

我正在尝试编写一个脚本,该脚本将一个或多个文件作为参数,并将大写字母转换为小写字母。原始文件的内容将替换为仅小写的内容。

参数中给出的文件必须存在,必须是普通文件,必须允许读/写,不能允许执行,也不能为空。

# 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

我的问题是,当我在普通 shell(非 root)中执行脚本时出现以下错误:

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

以下是 ls -ld /tmp 的结果:

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

答案1

我不知道第 45 行是哪一行,但该行$($ficTemp > $param)是错误的,可能会出现此错误:它尝试将临时文件作为脚本执行并将其输出写入$param,然后执行返回的字符串。

有两点明显错误:-

  1. 除非您遇到异常,否则umask您没有使临时文件可执行,因此会出现错误。
  2. 脚本的输出被重定向,因此永远不会返回任何内容,并且$()没有任何用处。

你想做什么?如果你想将临时文件复制回原始文件,则以下任何一种方法都可以实现:-

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

最后一种方法更加高效,因为它不需要访问数据并且它同时删除临时文件,但是原来的所有者和访问权限被替换了(感谢 G-Man 指出这一点)。

无论您做什么,都应该使用"$param",以允许在文件名或路径中嵌入空格。

相关内容