Xargs

無法理解 gsettings + xargs 行為

  • November 6, 2018

為了設置舞台,在這個範例回顯場景中,我有這 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

發生了什麼事,我怎樣才能在這個問題上獲得更多的可見性?

-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}

接下來要做什麼取決於你想用這些命令實現什麼。

引用自:https://unix.stackexchange.com/questions/480230