morla
morla

Reputation: 755

sed permission denied on temporary file

With sed I try to replace the value 0.1.233... On the command line there is no problem; however, when putting this command in a shell script, I get an error:

sed: couldn't open temporary file ../project/cas-dp-ap/sedwi3jVw: Permission denied 

I don't understand where this temporary sedwi file comes from.

Do you have any idea why I have this temporary file and how I can pass it?

$(sed -i "s/$current_version/$version/" $PATHPROJET$CREATE_PACKAGE/Chart.yaml)

++ sed -i s/0.1.233/0.1.234/ ../project/cas-dp-ap/Chart.yaml
sed: couldn't open temporary file ../project/cas-dp-ap/sedwi3jVw:   Permission denied
+ printf 'The version has been updated to : 0.1.234 \n\n \n\n'
The version has been updated to : 0.1.234 
+ printf '***********************************'

Upvotes: 8

Views: 18991

Answers (2)

jhnc
jhnc

Reputation: 16819

sed -i is "in-place editing". However "in-place" isn't really. What happens is more like:

  • create a temporary file
  • run sed on original file and put changes into temporary file
  • delete original file
  • rename temporary file as original

For example, if we look at the inode of an edited file we can see that it is changed after sed has run:

$ echo hello > a
$ ln a b
$ ls -lai a b
19005916 -rw-rw-r-- 2 jhnc jhnc 6 Jan 31 12:25 a
19005916 -rw-rw-r-- 2 jhnc jhnc 6 Jan 31 12:25 b
$ sed -i 's/hello/goodbye/' a
$ ls -lai a b
19005942 -rw-rw-r-- 1 jhnc jhnc 8 Jan 31 12:25 a
19005916 -rw-rw-r-- 1 jhnc jhnc 6 Jan 31 12:25 b
$ 

This means that your script has to be able to create files in the folder where it is doing the "in-place" edit.

Upvotes: 9

tripleee
tripleee

Reputation: 189789

The proper syntax is identical on the command line and in a script. If you used $(...) at the prompt then you would have received the same error.

sed -i "s/$current_version/$version/" "$PATHPROJET$CREATE_PACKAGE/Chart.yaml"

(Notice also the quoting around the file name. Probably your private variables should use lower case.)

The syntax

$(command)

takes the output from command and tries to execute it as a command. Usually you would use this construct -- called a command substitution -- to interpolate the output of a command into a string, like

echo "Today is $(date)"

(though date +"Today is %c" is probably a better way to do that particular thing).

Upvotes: 1

Related Questions