sed 临时文件权限被拒绝

mor*_*rla 8 linux bash shell

我尝试sed替换值0.1.233 ...在命令行上没有问题;但是,当将此命令放入 shell 脚本中时,出现错误:

sed: couldn't open temporary file ../project/cas-dp-ap/sedwi3jVw: Permission denied 
Run Code Online (Sandbox Code Playgroud)

我不明白这个临时 sedwi 文件来自哪里。

您知道为什么我有这个临时文件以及如何传递它吗?

$(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 '***********************************'
Run Code Online (Sandbox Code Playgroud)

jhn*_*hnc 8

sed -i是“就地编辑”。然而“就地”并非如此。发生的情况更像是:

  • 创建一个临时文件
  • 在原始文件上运行 sed 并将更改放入临时文件中
  • 删除原文件
  • 将临时文件重命名为原始文件

例如,如果我们查看已编辑文件的索引节点,我们可以看到它在 sed 运行后发生了更改:

$ 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
$ 
Run Code Online (Sandbox Code Playgroud)

这意味着您的脚本必须能够在执行“就地”编辑的文件夹中创建文件。


tri*_*eee 1

命令行和脚本中的正确语法是相同的。如果您$(...)在提示时使用,那么您会收到相同的错误。

sed -i "s/$current_version/$version/" "$PATHPROJET$CREATE_PACKAGE/Chart.yaml"
Run Code Online (Sandbox Code Playgroud)

(另请注意文件名周围的引号。也许您的私有变量应该使用小写。)

语法

$(command)
Run Code Online (Sandbox Code Playgroud)

获取输出command并尝试将其作为命令执行。通常,您会使用这种构造(称为命令替换)将命令的输出插入字符串中,例如

echo "Today is $(date)"
Run Code Online (Sandbox Code Playgroud)

(尽管date +"Today is %c"这可能是做某件事的更好方法)。