I'm trying to append the address information to a file. I am getting an error message of

tee: /OR_595.txt: Permission denied

I'm using the following code to create the file.

cstates=($(awk -v FS=^ '{print $5}' "$1"))

for i in "${cstates[@]}"


if [[ ! -f "./$2/$i/${i}_595.txt" ]]; then

    echo "Making ${i}_595.txt File"
    touch "./$2/$i/${i}_595.txt"
    chmod a+x "./$2/$i/${i}_595.txt"
    else echo "File ${i}_595.txt already exists"


This code is writing to the file.


while IFS=^ read -r company_name address1 address2 city state zip phone

printf "Company Name: %s\nCompany Address: %s%s, %s, %s, %s\nCompany Phone Number: %s\n\n" \
      "${company_name}" "${address1}" "${address2}" "${city}" "${state}" "${zip}" "${phone}" | tee -a "${outputdir}/${state}_595.txt" > /dev/null

done < $file_name

I've checked the permissions on the each of the folders, subfolders and the file

drwxrwxr-x 56 jh78454 jh78454 4096 Feb 19 14:58 States
drwxrwxr-x 2 jh78454 jh78454 4096 Feb 19 15:14 WA
-rwxrwxr-x 1 jh78454 jh78454 0 Feb 19 15:14 WA_595.txt

I've looked at the permissions via WinSCP for several of the folders and files and they are all the same. Not sure why I'm getting permission denied error.

  • 2
    Where is ${outputdir} defined? Feb 19, 2020 at 22:24
  • 2
    I search all of your code, but I can't find where you use tee. Feb 19, 2020 at 22:27
  • Also edit question to tell us what operating system, and file-system you are using. Feb 19, 2020 at 22:29
  • 6
    Inspect your error message. "outputdir" is undefined or empty. Consequently, it is trying to write to a file in the root directory, for Oregon. "/OR_595.txt" is a bit of a give-away. Feb 19, 2020 at 22:35
  • Why are you using tee but discarding part of its output? That makes no sense - use printf "..." >> "${outputdir}/${state}_595.txt" instead. Mar 16, 2020 at 20:24

1 Answer 1


Not sure why I'm getting permission denied error.

Apparently ${outputdir} expands to an empty string (the variable is not defined or empty) and ${state} expands to OR. This way ${outputdir}/${state}_595.txt expands to /OR_595.txt.

/OR_595.txt points to a file named OR_595.txt in the root directory /. This file probably doesn't exist. It's normal a regular user cannot create "random" files in /.

Define outputdir so ${outputdir}/${state}_595.txt points to a file you can write to. You're using tee -a so maybe the design is the file already exists. I guess the first snippet is supposed to create the file. It uses ./$2/$i/, so you need to set outputdir in the second snippet accordingly.

  • Correct, the ${outputdir} should have been $2 and it was missing a subfolder. $2/$5/${state}_595.txt is correct instead of ${outputdir}/${state}_595.txt I keep looking at the code and completely missed it.
    – Kyle Heath
    Feb 19, 2020 at 22:47
  • Your use of tee in | tee -a "${outputdir}/${state}_595.txt" > /dev/null is not necessary. It appends a copy of the output to the file, and then discards the output. Shell appends to files with the >> operator. That whole pipeline extension could be written >> "${outputdir}/${state}_595.txt". In fact, that whole output could be moved outside the while block, like done < "$file_name" >> "${outputdir}/${state}_595.txt". That avoids the output being opened and closed for each line added. Feb 20, 2020 at 0:00

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .