Problema na compreensão de gsettings + xargs behavior

0

Para definir o cenário, eu tenho este 2 equivalente e trabalhando 'xargs' comandos compostos, neste cenário de eco de exemplo:

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

Agora, quando eu substituir o comando 'echo' por 'gsettings get', o segundo caso falha:

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

O que está acontecendo e como posso obter mais visibilidade sobre o assunto?

    
por Ghiro 06.11.2018 / 22:18

1 resposta

1

As opções -I {} de xargs farão com que passe uma linha inteira da entrada como um único argumento.

Isto é o que diz a manpage de xargs (1):

-I replace-str

Replace occurrences of replace-str in the initial-arguments with names read from standard input. Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.

Você pode ver facilmente a diferença usando um script de impressão de argumentos em vez de 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}

O que fazer a seguir depende do que você deseja alcançar com esses comandos.

    
por 06.11.2018 / 22:40