Это означало бы учетную запись, отключенную для основанного на пароле входа в систему. Учетная запись с пустым паролем будет иметь пустое поле.
Оболочки не делают никакой перестройки кода, который им вручают, это просто интерпретируется одна строка после другого (ничто иное действительно очень не распознается в интерпретаторе команд). Большая часть времени, проведенного оболочкой, переходит к лексическому анализу/парсингу/запуску названные программы.
Для простых операций (как те портящие строки в примерах в конце вопроса) я был бы удивлен, не затопляет ли время для загрузки программ крохотных различий в скорости.
Мораль истории - то, что при реальной необходимости в большей скорости Вы более обеспечены с (полу) скомпилированным языком как Perl или Python, который быстрее для выполнения для начала, в котором Вы можете записать многие операции, упомянутые непосредственно, и не должны обращаться к внешним программам, и имеет опцию вызвать внешние программы или вызов в оптимизированный C (или безотносительно) модули, чтобы сделать большую часть задания. Это - причина, почему в Fedora "сахар системного администрирования" (графический интерфейсы пользователя, по существу) записаны в Python: Может добавить хороший GUI с не слишком много усилия, достаточно быстро для таких приложений, иметь прямой доступ к системным вызовам. Если это не достаточно скорости, захват C++ или C.
Но не идите туда, если Вы не можете доказать, что увеличение производительности стоит потери в гибкости и время разработки. Сценарии оболочки не слишком плохи для чтения, но я дрожу, когда я помню, что некоторые сценарии раньше устанавливали Ultrix, который я когда-то пытался дешифровать. Я сдался, слишком много "оптимизации сценария оболочки" было применено.
Первое правило оптимизации: не оптимизировать. Тест сначала. Если тесты показывают, что Ваша программа является слишком медленной, ищите возможную оптимизацию.
Единственный способ быть уверенным состоит в том, чтобы сравнить для Вашего варианта использования. Существуют некоторые общие правила, но они только запрашивают типичные объемы данных в типовых приложениях.
Некоторые общие правила, которые могут или не могут быть верными ни при каком конкретном обстоятельстве:
echo $foo
медленнее, чем echo "$foo"
, потому что без двойных кавычек, это разделяет $foo
в слова и интерпретирует каждое слово как подстановочный шаблон имени файла. Что еще более важно, то разделение и globbing поведение редко желаемы. Поэтому не забудьте всегда помещать двойные кавычки вокруг замен команды и подстановок переменных: "$foo"
, "$(foo)"
.cut
или head
может быть эмулирован с sed
, но sed
будет медленнее и awk
будет еще медленнее. Строковая обработка Shell является медленной, но для коротких строк она в основном бьет вызов внешней программы.Редко, чтобы производительность была беспокойством в сценариях оболочки. Список выше чисто показателен; это прекрасно подходит для использования “медленных” методов в большинстве случаев, поскольку различием часто является часть процента.
Обычно точка сценария оболочки должна получить что-то сделанное быстро. Необходимо получить много от оптимизации для выравнивания по ширине тратящих дополнительных минут, пишущий сценарий.
python
и ruby
определенно медленнее для запуска, по крайней мере, в моей системе, perl
так же быстро для запуска как bash
или ksh
. GNU awk значительно медленнее, чем GNU sed особенно в utf-8 локалях, но он не верен для всего awks и всех семян. ksh93> тире> pdksh> zsh> удар не всегда так ясен. Некоторые оболочки лучше в некоторых вещах, чем другие, и победитель является не всегда тем же.
– Stéphane Chazelas
09.03.2013, 14:33
Мы расширимся здесь на нашем globbing примере выше для иллюстрирования некоторых рабочих характеристик интерпретатора сценария оболочки. Сравнение
bash
иdash
интерпретаторы для этого примера, где процесс порожден для каждого из 30 000 файлов, показывают, что тире может разветвитьсяwc
процессы почти дважды с такой скоростью, какbash
bash-4.2$ time dash -c 'for i in *; do wc -l "$i"; done>/dev/null'
real 0m1.238s
user 0m0.309s
sys 0m0.815s
bash-4.2$ time bash -c 'for i in *; do wc -l "$i"; done>/dev/null'
real 0m1.422s
user 0m0.349s
sys 0m0.940s
Сравнение основного цикличного выполнения проносится, не вызывая
wc
процессы, шоу, что цикличное выполнение тире почти в 6 раз быстрее!$ time bash -c 'for i in *; do echo "$i">/dev/null; done' real 0m1.715s user 0m1.459s sys 0m0.252s $ time dash -c 'for i in *; do echo "$i">/dev/null; done' real 0m0.375s user 0m0.169s sys 0m0.203s
Цикличное выполнение является все еще относительно медленным в любой оболочке, как продемонстрировано ранее, таким образом, для масштабируемости мы должны попытаться использовать более функциональные методы, таким образом, повторение выполняется в скомпилированных процессах.
$ time find -type f -print0 | wc -l --files0-from=- | tail -n1 30000 total real 0m0.299s user 0m0.072s sys 0m0.221s
Вышеупомянутое является безусловно наиболее эффективным решением и иллюстрирует тезис хорошо, что нужно сделать как можно меньше в сценарии оболочки и цели только для использования его для соединения существующей логики, доступной в богатом наборе утилит, доступных в системе UNIX.
Украденный От Общего сценария оболочки путает Pádraig Brady.
for i in *; do wc -l "$i">/dev/null; done
лучше сделайте for i in *; do wc -l "$i"; done>/dev/null
.
– manatwork
07.03.2013, 09:29
wc -l
, проверьте, что я обновил в сообщении Ваш вывод
– Rahul Patil
07.03.2013, 10:20