Почему xargs разделяет кавычки от входа?

Первая строка является "хижиной" и используется для выполнения сценария, не имея необходимость передавать его как аргумент командной строке оболочки. Вторая строка является комментарием и понята только chkconfig программа. Это используется, чтобы гарантировать, что сценарий запустится на определенном уровне выполнения.

26
08.05.2012, 16:26
4 ответа

От xargs руководство:

Если Вы хотите, чтобы входной параметр содержал пробелы или горизонтальные вкладки, включите его в двойные кавычки или апострофы. Если аргумент содержит символ двойной кавычки ("), необходимо включить аргумент в апострофы. С другой стороны, если аргумент содержит апостроф ('), необходимо включить аргумент в двойные кавычки. Можно также поместить обратную косую черту (\) перед символом, чтобы сказать xargs игнорировать любое особое значение символ может иметь (например, пробельные символы или кавычки).

Это означает, что можно выйти из кавычек, если кавычки заключаются себя в кавычки:

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

будет работать, но echo /Place/=\'http://www.google.com\' | xargs echo не будет.

10
27.01.2020, 19:39
  • 1
    Ничто против вниз голосов кроме комментария к причине не помогло бы :-) –  Matteo 20.04.2015, 08:35
  • 2
    Что, если Вы передаете по каналу во входе? Если у меня есть сценарий, это производит "/Place/='http://www.google.com'", как я могу правильно выйти из него? –  Roger Filmyer 08.07.2015, 00:19
  • 3
    @RogerFilmyer your_script | параллель - shellquote |... –  Ole Tange 18.04.2016, 15:40

Вы могли использовать Параллель GNU вместо этого:

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

Затем Вы не должны делать заключения в кавычки себя.

Подробнее: https://www.youtube.com/playlist? list=PL284C9FF2488BC6D1

8
27.01.2020, 19:39

Я нашел здесь другое решение https://stackoverflow.com/a/17468560/1795821 , которое предлагает использовать sed , чтобы избежать кавычек.

Например:

sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\\'/g" | xargs echo
/Place/='http://www.google.com'
4
27.01.2020, 19:39

если вы хотите xargsдо игнорировать кавычки одним из хороших решений может быть использование флага xargsxargs -0

Directly from Man page OPTIONS

OPTIONS -0, --null

Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode.

Я проверил в системе GNU, что установка разделителя на определенное значение (, например символ новой строки )с параметром -d(, а не только -0), также приведет к тому, что xargsне будет относитесь к кавычкам и т.д. особенно:

-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$ 
31
27.01.2020, 19:39

Теги

Похожие вопросы