Pull to refresh
9
0
Анатолий Парпалыгин @027

Админ локалхоста

Send message
Кстати, да, я вечно про него забываю.
Ну так -R убрать, и не полезет. А зачем там -v, непонятно — chown и так руга… А-а! автор надеялся, что будут запускать таки от рута! )))
Знатная замена трейсруту — mtr (my traceroute)
А тот наколенный скрипт не показывает хопы, которые не отвечают.
git config —global core.quotepath off

Пользуйтесь на здоровье :)
Я за эти клавиатурные таб-таб каюсь, ибо совсем забыл, что:
  • автоподстановка не является всеобщим правилом для *никсов, а есть только там, где она сознательно реализована мейнтейнером для конкретного окружения конкретной версии*;
  • есть способ посмотреть без выстукивания по клаве, что выдаст автоподстановка в разных ситуациях, а именно — команда баша 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 гига данных и заставить перл его сортировать?
будет сортировать
неожиданно

у меня echo — файл в bin

У меня и то, и другое:
$ compgen -c | grep -E '^echo$'
echo
echo

$ which echo
/bin/echo

$ type echo
echo — это встроенная команда bash
Да, она есть во всех системах из каких-то соображений. Полагаю, чтобы в пользовательских программах не ломался код типа:
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.

В частности, вот так можно отловить дублирующуюся команду:
$ compgen -c | grep -E '^time$'
time
time

Попалась, зараза!
Конечно уверен. На то они и builtins, к чему тратить ресурсы системы на порождение нового процесса?..

Уверенность на основе рассуждения есть предположение. :) Ну да бог с ним. Дело тут совсем не в отдельности процесса.

Ах, да, прав комментатор про то, что bash подставляет значения переменных при вызове. Конечно, когда мы пишем cmd $VAR любой shell обязан подставить $VAR до вызова команды.

Отож! Он идет по строке справа налево, натыкается на $LANG, рожает указатель (наверное, я в сях не силен) и тупо скармливает его эху. До модифицированного одноразового окружения ему дела нет.
А внешне кажется, что это эхо игнорирует, зараза такая своенравная. :)
Кстати, подляна изрядная, эти одноименные встроенные команды. Когда не знаешь об этом, массу времени можно потерять, ругая ни в чем не повинного составителя мана утилиты.
echo — встроенная команда bash (builtin). То есть, при выполнении echo не будет порожден новый процесс, в котором будет запущена программа /bin/echo.

Я приводил в исходном каменте оба варианта, со встроенным эхом и с /bin/echo. Поведение одинаковое.

встроенная команда bash… не будет порожден новый процесс

Вы это точно знаете или предполагаете?
теперь нужны бенчмарки

Прошелся по примерам в первой статье.
Тестовая дира — плоский каталог, около 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 переключение языка срабатывает.
chown -v -R root:root ./

Главное, от рута по рассеянности не запустить. :)
И мусора в выхлопе много.
Потому что $LANG это переменная, которая уже объявлена, и при выполнении этой команды она «разворачивается» в значение ru_RU.UTF-8.

Как же так? Я ее только что переопределил из 'ru_RU.UTF-8' в 'C'.
Почему-то echo это игнорирует, а вот, скажем, man, radeontop используют значение 'C'.

Information

Rating
Does not participate
Location
Волгоград, Волгоградская обл., Россия
Date of birth
Registered
Activity