Пакеты прибывают в тестирование после того, как они были достаточно протестированы на sid, а именно, две недели без любых выдающихся отчетов об ошибках. Тестирование является версией RC, так сказать. Это обычно - несколько дней позади sid с точки зрения последнего программного обеспечения.
Если Вы не делаете никакой Debian-определенной разработки на своей машине, пойдите с тестированием. Если бы Вы планируете способствовать Debian, Вы были бы более обеспечены с sid, так как все новые изменения должны работать над sid средой.
Тем не менее я использовал sid на своем рабочем столе больше года без любых катастрофических отказов.
Подробнее: http://www.debian.org/doc/FAQ/ch-ftparchives#s-testing
Для самого основного '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
переменная
Существует два основных способа преобразовать поток вывода в список аргументов. Быстрое (и иногда грязный) способ сделать это с 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
все мои примеры так, чтобы, если Вы копируете и вставляете код, это ничего на самом деле не делало, просто покажите Вам тестовый прогон.
Не отнимать у других ответов... Это - просто еще один способ сделать это:
for pkg in $( pkg_info | grep proto| sed 's/\([a-z0-9]*\).*/\1/' ) ; do
pkg_deinstall $pkg
done
Заключение в кавычки является кошмаром в примере, таким образом, я лично склонен использовать | while read foo ...
как правило.
while IFS= read -r foo; do …
(-r
отключить специальный режим обратных косых черт и IFS=
постараться не разделять начальный пробел). дата
– Gilles 'SO- stop being evil'
01.08.2011, 01:15
pkg_deinstall
команда позволяет несколько аргументов, простоеpkg_info | grep proto | sed 's/([a-z0-9])./\1/' | xargs pkg_deinstall
должен быть достаточно. – Stéphane Gimenez 29.07.2011, 20:16ls
действовать на файлы означает избежаться. Используйте оболочку globing такой какfor file in *; do [...] done
илиfind -exec
вместо этого. В вопросе этого OP у них уже есть список сгенерированных пакетов, таким образом передавание по каналу этого в некоторое время цикл чтения прекрасно, вероятно, но для имен файлов это не! – Caleb 30.07.2011, 00:51ls
? – user unknown 30.07.2011, 06:16