xargs | Использовать ввод как команду

  • Обычные пакеты собираются из стабильных версий или стабильных тегов git репозитория. Программа компилируется на компьютере пользователя, а затем устанавливается. Это займет время.

  • Пакеты с суффиксом -binуже собраны вышестоящим сопровождающим и где-то доступны. Таким образом, пользователям не нужно компилировать пакет на своей машине. Скрипт PKGBUILDзагружает, извлекает и устанавливает файлы. Некоторое проприетарное программное обеспечение выпускается в этом формате, где исходный код недоступен.

  • Пакеты с суффиксом -gitсобираются из последней фиксации из репозитория git, независимо от того, является она стабильной или нет. Таким образом, пользователь получает последние исправления или исправления. Это также скомпилировано на пользовательской машине, а затем установлено.

  • Различие между пакетами AUR можно легко понять из их соответствующего PKGBUILDфайла (сценария оболочки, такого как )в функции source(). Вот пример:

    • Дляgithub-desktopисточником является стабильный git релиз тег:
    pkgver=x.y.z
    _pkgver="${pkgver}-linux1"
    gitname="release-${_pkgver}"
    https://github.com/shiftkey/desktop.git#tag=${gitname}
    
    • Дляgithub-desktop-binисточником является уже упакованный пакет Debian:
    pkgver=x.y.z
    _pkgver="${pkgver}-linux1"
    gitname="release-${_pkgver}"
    https://github.com/shiftkey/desktop/releases/download/${gitname}/GitHubDesktop-linux-${_pkgver}.deb
    
    • Дляgithub-desktop-gitисточником является последний мастер ветвь:
    https://github.com/shiftkey/desktop.git
    

    Дополнительная литература:

5
24.11.2020, 18:19
1 ответ

В xargs -I replstr utility arguments, POSIX требует , чтобы replstrзаменялся только в arguments, а не utility. GNU xargsсоответствует требованиям в этом отношении (busybox xargsне соответствует ).

Чтобы обойти это, вы можете использовать envкак утилиту:

which -a... | xargs -I cmd xargs env cmd --version

(подавляет начальные пробелы, обратную косую черту, одинарные кавычки, двойные кавычки, новую строку, возможно, последовательности байтов и не формирует допустимые символы из-за того, как xargsинтерпретирует свой ввод ).

Или лучше:

for cmd in (which -a...)
  $cmd --version
end

Что ограничивало бы проблемные символы в именах файлов только новой строкой.

В любом случае, вы не можете и не хотите использовать здесь eval. evalэто встроенная в оболочку (специальная встроенная в оболочки POSIX команда )для интерпретации кода оболочки, а не для запуска команд. xargs— это внешняя команда оболочки,поэтому он не может запускать встроенные функции вашей оболочки или любой другой оболочки без запуска интерпретатора этой оболочки, например:

which -a... |
  xargs -rd '\n' sh -c 'for cmd do "$cmd" --version; done' sh

Использование shвместо fishздесь, поскольку встроенные скрипты AFAIK fishне могут принимать аргументы. Но все же не с использованием evalздесь, что не имело бы смысла, поскольку мы не хотим, чтобы эти имена файлов интерпретировались как код оболочки.

Также используется -rd '\n', который специфичен для GNU -, но не имеет всех проблем -I, для передачи полного содержимого всех строк в качестве отдельных аргументов утилите (здесьsh).

10
18.03.2021, 22:47

Теги

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