为了做好准备,在这个示例 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}
接下来要做什么取决于您想要使用这些命令实现的目标。