Выполнение действий со списком от оболочки

Пакеты прибывают в тестирование после того, как они были достаточно протестированы на sid, а именно, две недели без любых выдающихся отчетов об ошибках. Тестирование является версией RC, так сказать. Это обычно - несколько дней позади sid с точки зрения последнего программного обеспечения.

Если Вы не делаете никакой Debian-определенной разработки на своей машине, пойдите с тестированием. Если бы Вы планируете способствовать Debian, Вы были бы более обеспечены с sid, так как все новые изменения должны работать над sid средой.

Тем не менее я использовал sid на своем рабочем столе больше года без любых катастрофических отказов.

Подробнее: http://www.debian.org/doc/FAQ/ch-ftparchives#s-testing

3
30.07.2011, 00:49
3 ответа

Для самого основного 'foreach' существует xargs, это читает некоторые параметры, и добавьте их к некоторой другой командной строке. Например, можно попробовать:

> cut -d: -f1 /etc/passwd | xargs -n1 echo user:

Обратите внимание, что необходимо передать a -d'\n' аргумент xargs в случае имена пользователей могли содержать пробелы. Добавлять все ¹ параметры к тому же использованию команды:

> cut -d: -f1 /etc/passwd | xargs echo users:

Для более общих циклов можно использовать это:

> cut -d: -f1 /etc/passwd | while read i; do echo $i; done

На этот раз, $i может быть помещен куда угодно в последовательности одной или нескольких команд. Исходные данные читаются одна строка за один раз и хранятся в переменной i. Также возможно разделить ² строка и сохранить его в нескольких переменных:

> cut -d: -f1,6 /etc/passwd --output-delimiter=' ' | \
  while read i j; do echo home directory of user $i is $j; done

Обратите внимание, что для циклов по необработанным именам файлов, следующее лучше (см. комментарии):

> for i in *.txt; do echo file: $i; done


1. Более точно: столько, сколько система позволит.
2. Согласно IFS переменная

5
27.01.2020, 21:10
  • 1
    В Вашем случае, начиная с pkg_deinstall команда позволяет несколько аргументов, простое pkg_info | grep proto | sed 's/([a-z0-9])./\1/' | xargs pkg_deinstall должен быть достаточно. –  Stéphane Gimenez 29.07.2011, 20:16
  • 2
    Да, это - то, в чем я нуждался. Я получил его работа.Большое спасибо! –  EhevuTov 29.07.2011, 20:18
  • 3
    Парсинг вывода ls действовать на файлы означает избежаться. Используйте оболочку globing такой как for file in *; do [...] done или find -exec вместо этого. В вопросе этого OP у них уже есть список сгенерированных пакетов, таким образом передавание по каналу этого в некоторое время цикл чтения прекрасно, вероятно, но для имен файлов это не! –  Caleb 30.07.2011, 00:51
  • 4
    @Caleb это должно быть в порядке, пока я делаю regex с sed правом? –  EhevuTov 30.07.2011, 01:46
  • 5
    @Stephane: Почему Вы не делаете свой комментарий Вашим ответом, избегая проблематичного ls? –  user unknown 30.07.2011, 06:16

Существует два основных способа преобразовать поток вывода в список аргументов. Быстрое (и иногда грязный) способ сделать это с xargs. По умолчанию это принимает стандартный входной поток и выполняет команду с каждой строкой входа как отдельный аргумент. Необходимо всегда быть осторожны относительно формата входа, потому что пробелы и другие символы легки к misinturpret при передаче как аргументы. Имена пакета, однако, являются relativly сейфом. Они не должны включать подстановочные символы оболочки или новые строки или что-либо сумасшедшее, таким образом, вот то, на что оно было бы похоже для Вашей команды: [3]

$ pkg_info | grep proto | sed 's/\([a-z0-9]*\).*/\1/' | xargs pkg_deinstall -n

Частый случай - то, что на самом деле необходимо выполнить команду однажды для каждой обрабатываемой строки. В этом случае -n аргумент пригождается. Можно использовать -n1 выполнять их по одному, или даже -n10 выполнять их в пакетах десять.

$ [pipline] | xargs -n1 pkg_deinstall -n

Теперь скажем, у Вас есть потребность добавить другой аргумент после автоматически сгенерированный однажды. В этом случае можно использовать '-I' для определения строки для замены автоматически сгенерированными аргументами. Это также позволит Вам делать, вещам нравится, заключают аргумент в кавычки при необходимости. Можно затем отформатировать, куда аргументы будут помещены как это: [1] [2]

$ [pipline] | xargs -n1 -I{} pkg_deinstall -n "{}" --trailing-argument

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

$ [pipline] | while read line; do
      echo "Uninstalling $line..."
      pkg_deinstall -n "$line"
  done

Обратите внимание что pkg_deinstall автоматически использует выражение в качестве частичного шарика соответствия, так быть осторожным относительно того, что Вы передаете, чтобы быть удаленными. Передача базового имени некоторого компонента системы удалит не только, что компонент, но и все, что имеет имя как он или зависит от него! Это могло быть катастрофически, поэтому всегда тщательно проверяют Ваш набор пакета. Можно использовать -n сделать пробный прогон, который показывает то, что обошлось бы без фактическое выполнение его [3] и/или -i выполнять каждый шаг в интерактивном режиме.

[1] Я использовал {} поскольку, потому что находят и другие подобные исполнительные функции используют этот формат, но любая уникальная строка сделает.
[2] pkg_deinstall команда не имеет никаких аргументов, которые прибыли бы после шаблона, таким образом, это - пример только!
[3] Я добавил -n все мои примеры так, чтобы, если Вы копируете и вставляете код, это ничего на самом деле не делало, просто покажите Вам тестовый прогон.

3
27.01.2020, 21:10

Не отнимать у других ответов... Это - просто еще один способ сделать это:

for pkg in $( pkg_info | grep proto| sed 's/\([a-z0-9]*\).*/\1/' ) ; do
    pkg_deinstall $pkg
done

Заключение в кавычки является кошмаром в примере, таким образом, я лично склонен использовать | while read foo ... как правило.

1
27.01.2020, 21:10
  • 1
    Сделайте это while IFS= read -r foo; do … (-r отключить специальный режим обратных косых черт и IFS= постараться не разделять начальный пробел). дата –  Gilles 'SO- stop being evil' 01.08.2011, 01:15

Теги

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