无法理解 gsettings + xargs 行为

无法理解 gsettings + xargs 行为

为了做好准备,在这个示例 echo 场景中,我有这 2 个等效且有效的“xargs”组合命令:

// ok
$ echo org.cinnamon.desktop.keybindings.wm move-to-workspace-5 | xargs echo
org.cinnamon.desktop.keybindings.wm move-to-workspace-5

// ok
$ echo org.cinnamon.desktop.keybindings.wm move-to-workspace-5 | xargs -I '{}' echo '{}'
org.cinnamon.desktop.keybindings.wm move-to-workspace-5

现在,当我用“gsettings get”替换“echo”命令时,第二种情况失败:

// ok
$ echo org.cinnamon.desktop.keybindings.wm move-to-workspace-5 | xargs gsettings get
['<Alt>F4']

// fails
$ echo org.cinnamon.desktop.keybindings.wm move-to-workspace-5 | xargs -I '{}' gsettings get '{}'
Usage:
  gsettings [--schemadir SCHEMADIR] get SCHEMA[:PATH] KEY

  Get the value of KEY

 Arguments:
   SCHEMADIR A directory to search for additional schemas
   SCHEMA    The name of the schema
   PATH      The path, for relocatable schemas
   KEY       The key within the schema

发生了什么事?我如何才能更清楚地了解该问题?

答案1

-I {}的选项将xargs导致它将输入中的整行作为单个参数传递。

xargs(1) 的联机帮助页是这样说的:

-I 替换-str

将初始参数中出现的replace-str 替换为从标准输入读取的名称。还,不带引号的空格不会终止输入项;反而 分隔符是换行符。意味着 -x 和-L 1

您可以通过使用参数打印脚本而不是轻松地看到差异gsettings

$ cat /tmp/a
#! /bin/sh
echo -n "$0"; for a; do echo -n " {$a}"; done; echo
$ chmod 755 /tmp/a

$ echo foo bar | xargs /tmp/a
/tmp/a {foo} {bar}

$ echo foo bar | xargs -I '{}' /tmp/a '{}'
/tmp/a {foo bar}

接下来要做什么取决于您想要使用这些命令实现的目标。

相关内容