“rm”不接受内部命令作为参数

Voj*_*jta 5 command-line bash rm gsettings

为什么这不起作用?

rm $(gsettings get org.gnome.desktop.background picture-uri  | awk '{gsub("file://","");print $0}')
rm: cannot remove `\'/home/foggy/obrazky/wallpapers/24/Dark_Oxygen_by_Falco101.png\'': No such file or directory
Run Code Online (Sandbox Code Playgroud)

也许有些性格rm不接受?

mgd*_*mgd 10

看起来您的文件名周围有一对额外的单引号字符需要删除。

在这里,我有一个名为“hello”的文件:

$ ls
hello
Run Code Online (Sandbox Code Playgroud)

试图用这样的额外单引号删除它:

$ rm "'hello'"
Run Code Online (Sandbox Code Playgroud)

准确地给出了您看到的错误消息:

rm: cannot remove `\'hello\'': No such file or directory
Run Code Online (Sandbox Code Playgroud)

\'之前和名称后,你需要去掉单引号。

编辑:

在你的情况下(正如另一个回答者所指出的)输出

gsettings get org.gnome.desktop.background picture-uri
Run Code Online (Sandbox Code Playgroud)

返回如下结果:

'file:///usr/share/backgrounds/Tie_My_Boat_by_Ray_Garc%C3%ADa.jpg'
Run Code Online (Sandbox Code Playgroud)

所以你想去掉开头'file://和结尾'。这可以像这样正确使用sed(仅使用一个表达式与一组)

sed -e "s|^'file://\(.*\)'$|\1|g"
Run Code Online (Sandbox Code Playgroud)

或者更容易阅读(使用两个简单的表达式)

sed -e "s|^'file://||g" -e "s|'$||"
Run Code Online (Sandbox Code Playgroud)

请注意:

  • ^ 匹配行的开头
  • $ 匹配行尾。
  • 任何字符都可以用于sed包围搜索和替换表达式。通常,您会使用,/但在这种情况下使用其他东西更容易,所以我使用|.


gee*_*aur 6

仔细观察,您会注意到它嵌入了单引号,您必须将其删除。我将更awk改为 a sed

rm $(gsettings get org.gnome.desktop.background picture-uri |
     sed -e "s/'//g" -e 's,file://,,g')
Run Code Online (Sandbox Code Playgroud)

(虽然实际上我会先看看未经修改的输出是什么样的gsettings,以便让一些东西更防弹。)