如何在linux中为sed命令设置临时文件目录?

Rad*_*lav 10 linux bash sed

我有像这样修改文件的bash脚本

sed -i "/hello world/d" /etc/postfix/virtual
Run Code Online (Sandbox Code Playgroud)

我从Web应用程序运行此脚本.sed命令在该目录中创建临时文件,但Web应用程序工作的用户无权在该目录中创建文件.我不想为该文件夹的用户授予更多权限.是否可以为sed命令指定临时文件位置?

我是linux新手,很抱歉,如果我的问题太容易了,但我找不到任何解决方案.

谢谢!

小智 6

您可以使用moreutils中的“海绵” 。

sed  "/hello world/d" /etc/postfix/virtual | sponge /etc/postfix/virtual
Run Code Online (Sandbox Code Playgroud)


J. *_*ker 5

该文件必须通过临时文件进行修改,这实际上是sed所做的,但缺少权限。

处理这种情况时,我们只是手动执行此过程。

## TEMP File
TFILE=`mktemp --tmpdir tfile.XXXXX`
trap "rm -f $TFILE" 0 1 2 3 15

##
sed 's_XXX_YYY_' /etc/example > "$TFILE"
cat "$TFILE" > /etc/example

## trap Deletes TFILE on Exit
Run Code Online (Sandbox Code Playgroud)

  • 上面的方法起作用是因为您可以将配置文件设置为允许编辑,同时仍对包含目录进行保护。就我而言,我将组和组权限设置为允许我的个人帐户编辑文件,但保留所有其他权限不变。临时文件不在目录中,因此不会受到影响,并且配置文件将允许Cat工作。 (2认同)

Cen*_*bit 5

老问题,但我惊讶地发现没有人建议通过变量使用一些好的 RAM。这就是我最终所做的,根本不需要临时文件:

TEMP_SED=$(sed "/hello world/d" /etc/postfix/virtual)
echo "$TEMP_SED" > /etc/postfix/virtual
unset TEMP_SED
Run Code Online (Sandbox Code Playgroud)

ing时请注意变量周围的引号echo这是为了保留文件中的任何换行符所必需的。


anu*_*ava 2

您始终可以避免内联编辑:

sed "/hello world/d" /etc/postfix/virtual > /tmp/_foo

# mv /tmp/_foo /etc/postfix/virtual
Run Code Online (Sandbox Code Playgroud)

但我要提醒一下,网络用户编辑/etc/postfix/virtual是相当危险的。

  • 但我想如果没有“/etc/posstfix”的权限,那么“mv”就不可能了? (4认同)