Bash
帶有就地編輯的 Sed 更改文件的組所有權
我有
php
以這種方式與目標文件聯繫的 shell ( ) 腳本:
- 檢查文件和目錄是否可以用
php
‘s寫入is_writable()
(我認為這不是問題)sed
使用命令進行就地文件編輯:
grep -q "$search" "$passwd_file" && { sed -i "s|$search|$replace|" "$passwd_file"; printf "Password changed!\n"; } || printf "Password not changed!\n"
結果,我得到了(其他一切都正確,但是)文件應該
myuser:www-data
是myuser:myuser
.是否會
sed
更改文件組的所有權,如果可能的話,我該如何避免?
sed
就地編輯模式有一點問題-i
。sed
在同一目錄中創建一個名為 的臨時文件sedy08qMA
,其中y08qMA
是一個隨機生成的字元串。該文件填充了原始文件的修改內容。操作完成後,sed
刪除原始文件並將臨時文件重命名為原始文件名。所以這不是真正的就地編輯。它創建一個具有呼叫使用者權限的新文件和一個新的 inode 號。這種行為大多還不錯,但例如,硬連結會被破壞。但是,如果您想要真正的就地編輯,您應該使用
ed
. 它從標準輸入讀取命令並直接編輯文件,沒有臨時文件(它在ed
的記憶體緩衝區上完成)。一種常見的做法是使用printf
來生成命令列表:printf "%s\n" '1,$s/search/replace/g' wq | ed -s file
該
printf
命令產生如下輸出:1,$s/search/replace/g wq
這兩行是
ed
命令。第一個搜尋字元串search
並將其替換為replace
. 第二個將 (w
) 更改寫入文件並退出 (q
)。-s
抑制診斷輸出。