Por que xargs retira aspas da entrada?

25

Por que xargs retira aspas do texto de entrada?

Aqui está um exemplo simplificado:

echo "/Place/='http://www.google.com'" | xargs echo

saídas

/Place/=http://www.google.com

Existe alguma maneira de contornar isso? (xargs -0 não me ajuda)

ddario
fonte
1
xargstrata aspas e barras invertidas especialmente como parte das especificações . Poste o que você está tentando fazer xargs.
Jw013
3
xargs -0funciona para mim aqui ... Por que não ajuda?
derobert

Respostas:

10

Do xargsmanual:

Se você deseja que um argumento de entrada contenha espaços em branco ou guias horizontais, coloque-o entre aspas ou apóstrofos. Se o argumento contiver um caractere de aspas duplas ( "), você deverá colocar o argumento entre apóstrofos. Por outro lado, se o argumento contiver um apóstrofo ( '), você deverá colocar o argumento entre aspas duplas. Você também pode colocar uma barra invertida ( \) na frente de um caractere para dizer ao xargs para ignorar qualquer significado especial que o caractere possa ter (por exemplo, caracteres de espaço em branco ou aspas).

Isso significa que você pode escapar de aspas se as aspas forem citadas:

$ echo "/Place/=\'http://www.google.com\'" | xargs echo
/Place/='http://www.google.com'

vai funcionar, mas echo /Place/=\'http://www.google.com\' | xargs echonão vai.

Matteo
fonte
1
Nada contra votos para baixo, mas um comentário sobre a razão ajudaria :-)
Matteo
3
E se você estiver inserindo entradas? Se eu tenho um script que gera "/Place/='http://www.google.com'", como posso escapar corretamente dele?
Roger Filmyer 07/07
1
@RogerFilmyer your_script | paralelo --shellquote | ...
Ole Tange
19

se você quiser xargspara ignorar cita um dos bons soultion pode ser o uso de xargsbandeira xargs -0

Diretamente da página do manual

OPÇÕES -0, --nula

Os itens de entrada são finalizados por um caractere nulo em vez de por espaço em branco, e as aspas e a barra invertida não são especiais (todos os caracteres são literalmente). Desativa o final da sequência de arquivos, que é tratada como qualquer outro argumento. Útil quando itens de entrada podem conter espaço em branco, aspas ou barras invertidas. A opção GNU find -print0 produz entradas adequadas para este modo.

Eu verifiquei em um sistema GNU que definir o delimitador para um valor específico (como uma nova linha) com a -dopção (e não apenas -0) também causaria xargsnão tratar as aspas, etc. especialmente:

-bash-4.3$ { echo "a'b'c"; echo d; } | xargs -d$'\n' echo
a'b'c d
-bash-4.3$ rpm -qf "$(which xargs)"
findutils-4.6.0.0.99.11a05-alt1.x86_64
-bash-4.3$ { echo "a'b'c"; echo d; } | xargs echo
abc d
-bash-4.3$ 
Balman Rawat
fonte
7

Encontrei outra solução na página de manual: especifique explicitamente delimitador como '\ n'. Isso desativa o tratamento especial para aspas:

--delimiter = delim, -d delim

Os itens de entrada são finalizados pelo caractere especificado. O delimitador especificado pode ser um único caractere, um escape de caractere no estilo C, como \ n, ou um código de escape octal ou hexadecimal. Os códigos de escape octais e hexadecimais são entendidos como para o comando printf. Caracteres multibyte não são suportados. Ao processar a entrada, aspas e barra invertida não são especiais; todo caractere na entrada é interpretado literalmente.

Tão,

echo "/Place/='http://www.google.com'" | xargs -d'\n' echo

saídas

/Place/='http://www.google.com'
fungusakafungus
fonte
Observe que isso implica em GNU xargsou compatível #
Stéphane Chazelas
Observe também que também impede que o espaço e a guia sejam reconhecidos como delimitadores (provavelmente também no caso do OP).
Stéphane Chazelas
Balman deu uma solução semelhante ( na verdade, @imz ), embora a sua seja um pouco melhor, pois evita o uso do ksh93 $'...'operador de citação que não é encontrado em todas as implementações de shell.
Stéphane Chazelas
4

Encontrei outra solução aqui /programming//a/17468560/1795821 que sugere o uso sedpara escapar de aspas.

Por exemplo:

sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\\'/g" | xargs echo
/Place/='http://www.google.com'
Kristofor Carle
fonte