Обертывание команды, которая включает одинарные и двойные кавычки для другой команды

Это возможно, синтаксис довольно легок:

$ cat *.tar | tar -xvf - -i

-i опция игнорирует EOF в конце архивов tar из страницы справочника:

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)
10
26.10.2011, 23:15
1 ответ

Общий совет: если Вы имеете два уровня вложения, избегаете использования одинарных кавычек во внутренней команде и используете одинарные кавычки вокруг внешней команды.

Дополнительная подсказка: не используйте обратные галочки - `…` - для выполнения кода вместо этого используйте $(…) вокруг этого. Долларовыми круглыми скобками является в значительной степени DWIM ('Делают то, что я имею в виду') когда дело доходит до вложенных кавычек; одинарные левые кавычки имеют тайные, зависимые от оболочки правила.

watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'

При необходимости в одинарных кавычках в единственно заключенной в кавычки команде можно использовать '\''. Думайте об этих четырех символах как о способе заключить одинарную кавычку в кавычки в одинарных кавычках, хотя с технической точки зрения это создается как конец единственно заключенная в кавычки строка, добавьте литеральную одинарную кавычку и запустите новую единственно заключенную в кавычки строку (все еще добавленный к текущему слову).

Для более сложных случаев, или кропотливо считают кавычки или определяют временные переменные.

cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
watch_cmd='watch -n 3 "$cmd"'

Этот ответ не характерен для zsh. Zsh не приносит ничего главного здесь. Можно сохранить немного заключения в кавычки, потому что нет никакой потребности в двойных кавычках вокруг замен команды, и иногда существуют способы использовать созданные-ins а не внешние команды, которые уменьшают потребности заключения в кавычки, но базовые проблемы совпадают с в других оболочках.

О, и между прочим, отметьте это watch выполнит Вашу команду в sh, не в zsh. Если Вы хотите выполнить команду в zsh, необходимо работать

watch -n 3 -x zsh -c "$cmd"

на Debian/Ubuntu, и

export cmd
watch -n 3 'exec zsh -c "$cmd"'

(еще больше заключения в кавычки!) в другом месте.

16
27.01.2020, 20:01
  • 1
    Спасибо @Gilles. Это было очень полезно. Интересно watch не идет -x ни -c опции на моей машине. Я искал его онлайн и не нашел страниц справочника, которые упоминают их. Что делают эти опции? –  Amelio Vazquez-Reina 27.10.2011, 00:45
  • 2
    @intrpc -x говорит watch не передать команду через оболочку. Я просто узнал, что это характерно для Debian/Ubuntu, даже при том, что он не указал как таковой. -c передается zsh, не к watch. –  Gilles 'SO- stop being evil' 27.10.2011, 01:03
  • 3
    @Gilles -x и -exec опции оба существуют в моем watch (на хинду), таким образом, это определенно не Debian-конкретно. Возможно, Вы по сравнению с некоторой другой версией watch? Мой прибывает из procps пакета. –  rozcietrzewiacz 27.10.2011, 09:46
  • 4
    @rozcietrzewiacz watch прибывает из procps на Debian также. Официальный источник не имеет --exec. Пакет в Debian (и производные включая Ubuntu) добавляет опцию в Debian-определенном патче (watch_exec_beep.patch; это - “исполнительный патч часов Mortys” от ошибки № 410967). Хинду, возможно, принял подобный патч. –  Gilles 'SO- stop being evil' 27.10.2011, 10:42

Теги

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