URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 40818
[ Назад ]

Исходное сообщение
"OpenNews: 7 способов улучшить shell скрипты на /bin/sh"

Отправлено opennews , 21-Мрт-08 22:24 
"7 способов улучшить shell скрипты на /bin/sh (http://community.livejournal.com/ru_linux/1689071.html)"

URL: http://community.livejournal.com/ru_linux/1689071.html
Новость: http://www.opennet.me/opennews/art.shtml?num=14887


Содержание

Сообщения в этом обсуждении
"7 способов улучшить shell скрипты на /bin/sh"
Отправлено Great.Megatron , 21-Мрт-08 22:24 
самый главный (или самый первый) забыл -- писать на sh, а не на bash. на крайняк, честно писать, что это bash, а не sh. хотя, судя по freebsd-programmirovanie-na-shell, сам автор таких гадостей не делает.

"не густо"
Отправлено Анон , 22-Мрт-08 01:31 
> find ./ -name pkg-descr | xargs rm

Опять? find ./ -name pkg-descr -exec rm {} +
Пусть автор откроет для себя -exec <cmd> {} +, а то, не бось, знает только о -exec <cmd> {} \;

> 4. Ускорить grep
> Если вы ищите какую-то строку в больший объемах данных при помощи grep, то стоит использовать fgrep  
> который позволяет искать только вхождения строк, а не регулярных выражений   но и работает быстрее на
> 10-20%.

Еще больше тормозов добавляют regexp'ы, если использовать конструкцию со скобками \(smth\).

> 6. Чтоб не дать команде выводить что-либо на экран
> Можно использовать перенаправление стандартного вывода и стандартного потока ошибок в /dev/null
> ping -c foo.bar > /dev/null 2>/dev/null
> После этого уже можно проверять код завершения этой программы.

Еще можно использовать >&- 2>&-. Такой способ просто закроет file descriptor'ы. Это более правильный способ, но работает, к сожалению, не со всеми программами.

> kill -9 `ps -ax | grep PROCESS_NAME | grep -v grep | cut -c1-5`

А вот и автор пропалился о своем не ведении о команде pkill(1) и использовании SIGKILL для завершения работы программы, не говоря уже о том, что можно использовать один regexp вместо двух инкарнаций grep(1). Из списка можно еще удалить cut(1) и заменить всю конструкцию на

ps -ax -opid= -ocomm= | awk '/PROCESS_NAME/ { print $1 }' | xargs kill
или
pkill PROCESS_NAME

ps, Вот еще интересная ссылка: http://partmaps.org/era/unix/award.html
Там рассказывается какие ошибки часто совершают новички и копипастеры при составлении скриптов на shell.
И пара таких ошибок есть в этой заметке в LJ.