Я за эти клавиатурные таб-таб каюсь, ибо совсем забыл, что:
автоподстановка не является всеобщим правилом для *никсов, а есть только там, где она сознательно реализована мейнтейнером для конкретного окружения конкретной версии*;
есть способ посмотреть без выстукивания по клаве, что выдаст автоподстановка в разных ситуациях, а именно — команда баша compgen.
*) например, автодополнение в моей системе живет тут: /etc/bash_completion и тут: /etc/bash_completion.d.
О!
Сенькс.
Неисчислимы заковыристые ходы, придуманные в те давние времена, когда компьютеры были большими, а сообщество маленьким.
Множество частных, подробно ориентированных штучек-дрючек, и никто не ведал, что скоро придет диавол под личиной multimedia, и пожрет все, до чего дотянется мягкими, липкими, необъятными в своих слоях абстракций лапищами…
На прогретом кэше — почему нет? Чтением каталога все равно сишные программы занимаются, интерпретаторы чисто обертка. Баш, кстати, тоже интерпретатор.
А ls, что ls… оно по умолчанию, еще и сортирует. А без сортировки, вот:
time ls -f
...
real 0m0,114s
user 0m0,030s
sys 0m0,026s
И кто знает, что там набенчится, если перл заставить сорт… Черт! Вспомнился чудный перл с баша:
* Daemon потыкал палочкой в wd
яя
а чиво станет с перлом, если в хеш загнать 2 гига данных и заставить перл его сортировать?
будет сортировать
неожиданно
Да, она есть во всех системах из каких-то соображений. Полагаю, чтобы в пользовательских программах не ломался код типа: system("echo Hello world").
Если в путях есть /bin ничего не сломается. А так должно быть обязательно. Ну, если это не наколенная эмбедовка от васяна, понятно.
Соображения я встечал такое: большее быстродействие и меньший жор. Вызов внешней утилиты в любом случае накладно. К тому же встроенные нередко более убогие и потому скоростные.
запускаю type ls или type cat и т.д., чтобы знать точно, что не имею дело с алиасом или командой, которая взялась не из стандартного пути.
Кстати, есть оч. полезная команда в баше:
compgen -c will list all the commands you could run.
compgen -a will list all the aliases you could run.
compgen -b will list all the built-ins you could run.
compgen -k will list all the keywords you could run.
compgen -A function will list all the functions you could run.
compgen -A function -abck will list all the above in one go.
В частности, вот так можно отловить дублирующуюся команду:
Конечно уверен. На то они и builtins, к чему тратить ресурсы системы на порождение нового процесса?..
Уверенность на основе рассуждения есть предположение. :) Ну да бог с ним. Дело тут совсем не в отдельности процесса.
Ах, да, прав комментатор про то, что bash подставляет значения переменных при вызове. Конечно, когда мы пишем cmd $VAR любой shell обязан подставить $VAR до вызова команды.
Отож! Он идет по строке справа налево, натыкается на $LANG, рожает указатель (наверное, я в сях не силен) и тупо скармливает его эху. До модифицированного одноразового окружения ему дела нет.
А внешне кажется, что это эхо игнорирует, зараза такая своенравная. :)
Кстати, подляна изрядная, эти одноименные встроенные команды. Когда не знаешь об этом, массу времени можно потерять, ругая ни в чем не повинного составителя мана утилиты.
Прошелся по примерам в первой статье.
Тестовая дира — плоский каталог, около 15 тыщ файлов.
Делать лень, взял готовый.
$ ll | wc -l
14881
Выхлоп везде поскипан, естессно.
Бенчим
1)
time for i in ./* ./.* ; do echo $i ; done
...
real 0m0,263s
user 0m0,189s
sys 0m0,051s
time echo ./* ./.*
...
real 0m0,111s
user 0m0,070s
sys 0m0,008s
2)
(пришлось устанавливать, искаропка подвела)
time tree -aiL 1
...
real 0m0,226s
user 0m0,127s
sys 0m0,064s
3)
time find . -maxdepth 1 -mindepth 1
...
real 0m0,117s
user 0m0,039s
sys 0m0,034s
4)
time du -ad 1 .
...
real 0m0,164s
user 0m0,027s
sys 0m0,076s
5)
time tar -cvf /dev/null --no-recursion ./* ./.* 2>null
...
real 0m0,265s
user 0m0,121s
sys 0m0,111s
6)
time perl -e 'use feature "say"; opendir my $dh, "." or die "Could not open . for reading: $!\n"; while (my $thing = readdir $dh) { say $thing; };'
...
real 0m0,112s
user 0m0,038s
sys 0m0,029s
7)
time echo -e "import os\nfor i in os.listdir('.'): print(i)" | python
...
real 0m0,120s
user 0m0,032s
sys 0m0,039s
Мой вариант:
time rsync --list-only ./
...
real 0m0,210s
user 0m0,094s
sys 0m0,091s
Сама ls:
time ls
...
real 0m0,223s
user 0m0,103s
sys 0m0,043s
Именно так, потому что echo не «интересуют» переменные окружения.
Я понял так, что модифицированные переменные окружения выдаются программе в виде копии и исключительно для нужд настройки поведения.
$LANG интерпретатор берет из текущего окружения для всего сеанса ( а echo тут вообще ничего не решает).
Если бы удалось заставить echo ругаться на что-либо, тогда модифицированное значение переменной LANG влияло бы на язык сообщений. Как это и происходит в моей системе с man, nmap и radeontop, которые обучены русскому.
Трюк, походу, не bash-специфичный — в dash переключение языка срабатывает.
Потому что $LANG это переменная, которая уже объявлена, и при выполнении этой команды она «разворачивается» в значение ru_RU.UTF-8.
Как же так? Я ее только что переопределил из 'ru_RU.UTF-8' в 'C'.
Почему-то echo это игнорирует, а вот, скажем, man, radeontop используют значение 'C'.
А тот наколенный скрипт не показывает хопы, которые не отвечают.
Пользуйтесь на здоровье :)
compgen.*) например, автодополнение в моей системе живет тут:
/etc/bash_completionи тут:/etc/bash_completion.d.Сенькс.
Неисчислимы заковыристые ходы, придуманные в те давние времена, когда компьютеры были большими, а сообщество маленьким.
Множество частных, подробно ориентированных штучек-дрючек, и никто не ведал, что скоро придет диавол под личиной multimedia, и пожрет все, до чего дотянется мягкими, липкими, необъятными в своих слоях абстракций лапищами…
А ls, что ls… оно по умолчанию, еще и сортирует. А без сортировки, вот:
И кто знает, что там набенчится, если перл заставить сорт… Черт! Вспомнился чудный перл с баша:
У меня и то, и другое:
Если в путях есть
/binничего не сломается. А так должно быть обязательно. Ну, если это не наколенная эмбедовка от васяна, понятно.Соображения я встечал такое: большее быстродействие и меньший жор. Вызов внешней утилиты в любом случае накладно. К тому же встроенные нередко более убогие и потому скоростные.
Кстати, есть оч. полезная команда в баше:
В частности, вот так можно отловить дублирующуюся команду:
Попалась, зараза!
Уверенность на основе рассуждения есть предположение. :) Ну да бог с ним. Дело тут совсем не в отдельности процесса.
Отож! Он идет по строке справа налево, натыкается на $LANG, рожает указатель (наверное, я в сях не силен) и тупо скармливает его эху. До модифицированного одноразового окружения ему дела нет.
А внешне кажется, что это эхо игнорирует, зараза такая своенравная. :)
Я приводил в исходном каменте оба варианта, со встроенным эхом и с
/bin/echo. Поведение одинаковое.Вы это точно знаете или предполагаете?
Прошелся по примерам в первой статье.
Тестовая дира — плоский каталог, около 15 тыщ файлов.
Делать лень, взял готовый.
Выхлоп везде поскипан, естессно.
2)
(пришлось устанавливать, искаропка подвела)
3)
4)
5)
6)
7)
Мой вариант:
Сама ls:
Я понял так, что модифицированные переменные окружения выдаются программе в виде копии и исключительно для нужд настройки поведения.
$LANG интерпретатор берет из текущего окружения для всего сеанса ( а echo тут вообще ничего не решает).
Если бы удалось заставить echo ругаться на что-либо, тогда модифицированное значение переменной LANG влияло бы на язык сообщений. Как это и происходит в моей системе с man, nmap и radeontop, которые обучены русскому.
Трюк, походу, не bash-специфичный — в dash переключение языка срабатывает.
Главное, от рута по рассеянности не запустить. :)
И мусора в выхлопе много.
Как же так? Я ее только что переопределил из 'ru_RU.UTF-8' в 'C'.
Почему-то
echoэто игнорирует, а вот, скажем,man, radeontopиспользуют значение 'C'.