Shell / Hints
В каталоге /var/run можно найти группу файлов с расширением .pid , которые представляют из себя
метки запущенных демонов . Если вы выходите в интернет с помощью модема , то у вас в этом каталоге
образуется файл с названием типа /var/run/ppp0.pid (у меня на аспе это файл pppwatch-ppp0.pid).
В них хранится id-шник процесса . Можно написать скрипт , который будет проверять состояние
вашего модемного коннекта :
HOST=192.168.55.253 # адрес вашего гейта
SLEEP=1m # интервал пингования
if [ -e "/var/run/ppp0.pid" ]; then # проверка
echo " * * * PPP-UP is running * * * "
else
echo " * * * PPP0 interface is not up! * * * "
exit
fi
while [ -e "/var/run/ppp0.pid" ]
do # пингуем раз в минуту
ping -c 1 $HOST > /dev/null
sleep $SLEEP
done
Когда вы запускаете bash , во время инициализации он читает настройки из группы файлов :
* /etc/profile
* ~/.bash_profile
* ~/.bashrc
В них можно прописать свои персональные настройки с помощью алиасов .
Синтаксис команды
alias shortcut=`command -options`
Алиасы облегчают нашу жизнь . Например , следующую группу алиасов можно прописать в файле /root/bashrc
alias c='clear'
alias d='ls -lF'
alias dir='ls -lF'
alias ftp='ftp -v'
alias lpr='lpr -h'
alias rm='rm -i'
alias startx='startx >& /dev/null'
alias x='startx >& /dev/null'
Вместо длинной команды 'clear' теперь можно набрать просто с .
В файле /root/bashrc можно прописывать свои собственные функции и запускать их по имени , например :
hello()
{
echo "Всем привет из bashrc"
}
Затем , запустив в командной строке просто hello , мы получим приветствие .
Для анализа изменения настроек системы полезно завести отдельный каталог - назовем его /root/config_dist -
и скопировать туда основные конфигурационные файлы , такие например , как
* /etc/inittab
* /etc/profile
* /etc/rc.d/rc.*
* /etc/passwd
* /usr/X11R6/lib/X11/XF86Config
откуда их всегда можно будет восстановить в случае краха системы .
Затем можно сделать симлинки на другой каталог - /root/links , после чего все наиболее важные конфигурационные файлы
можно будет править в одном месте - в каталоге /root/links.
Полезные вещи , которые можно прописать в кронтабе и которые пришли из RH2.1
# обнуление wtmp
45 02 * * * root find /var/log/wtmp -size +32k -exec cp /dev/null {} \;
# удаление /var/tmp залежавшихся файлов (10 дней)
43 02 * * * root find /var/tmp/* -atime +3 -exec rm -f {} \; 2> /dev/null
Для того , чтобы заставить крон выполнять каждые 5 минут какую-то задачу , например проверку почты ,
можно прописать :
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/local/bin/checkmail
Следующая команда будет раз в начале месяца удалять устаревшие файлы из /tmp :
0 1 1 * * find /tmp -atime 3 -exec rm -f {} \;
Следующая команда выполняет обновление базы данных файлов (запускать ее лучше ночью ):
41 5 * * * updatedb --prunepaths="/tmp /var /proc /cdrom" > /dev/null 2>&1
strace - системная утилита , которая отслеживает системные вызовы .
Например , запустив команду strace /bin/bash , мы сможем отследить , какие системные вызовы происходят
при загрузке bash . Запустив ее с параметром -o
strace -o log /bin/bash
получим вывод в файл . Вот , например , первые строки этого лога на моей машине :
execve("/bin/bash", ["/bin/bash"], [/* 35 vars */]) = 0
uname({sys="Linux", node="localhost.localdomain", ...}) = 0
brk(0) = 0x900e000
open("/etc/ld.so.cache", O_RDONLY) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=62802, ...}) = 0
old_mmap(NULL, 62802, PROT_READ, MAP_PRIVATE, 4, 0) = 0xbf550000
close(4) = 0
open("/lib/libtermcap.so.2", O_RDONLY) = 4
...
Если вы хотите посмотреть сообщения , которые появляются при загрузке . наберите
dmesg
Для вывода содержимого каталога можно использовать следующую конструкцию :
if [ $# = 1 ]
then
{
for i in `find . -path './dev' -prune -o -print 2> /dev/null`
do
{
fgrep -i $1 $i > /dev/null 2>&1;
if [ $? = 0 ]
then
{
echo $i
}
fi;
} done;
}
else { echo "В качестве аргумента наберите хотя бы ./" }
fi;
Обратите здесь внимание на строку
find . -path './dev' -prune -o -print 2> /dev/null
Здесь мы заранее исключаем возможность сканирования каталога /dev .
Возможные проблемы мы выводим в /dev/null.
Обратите также внимание на одинарные кавычки,в которые поставлена команда find - это сделано для корректного
вывода в цикле for . Функция fgrep , которая должна искать регулярное выражение , в данном случае находит
непустое значение файла и распечатывает его .
Пример:
Предположим , что нам нужно пользователю после залогинивания прописать дополнительные настройки .
Для этого можно использовать файл /etc/profile . Например , руту прописать umask=022 , а всем остальным
пользователям 077 :
USER_WHOAMI=`whoami`
case "$USER_WHOAMI" in
"root") umask 022;;
*) umask 077;;
esac
Пример:
Нужно составить список динамических библиотек , которые прилинкованы к программе :
ldd /usr/local/bin/program_name
Теперь напишем скрипт для всех программ , лежащих в данном каталоге :
find /usr/local/bin/* -print |
while read FILE; do
echo $file
echo
ldd $file
echo
done
Если вы хотите , чтобы в консоли не было скроллинга , нужно использовать префикс :
echo -n "Эта строка будет выведена на экран без скроллинга ..."
Если вы хотите вернуться в предыдущий каталог , наберите :
cd ~- или cd -
Как обнулить файл /var/log/messages:
cp /var/adm/messages /var/log/messages.prev
cp /dev/null /var/log/messages
Строковые шаблоны
Есть 2 типа шаблонов - правые и левые . Для их задания используются идентификаторы :
# - решетка(слева)
% - процент (справа)
Пример:
Operator |
Function |
Example |
${foo#t*is} |
удаляет все , что слева от шаблона |
export $foo="this is a test" echo ${foo#t*is} is a test
|
${foo##t*is} |
удаляет все , что слева от шаблона , включая шаблон |
export $foo="this is a test" echo ${foo#t*is} a test
|
${foo%t*st} |
удаляет все,что справа от шаблона |
export $foo="this is a test"
echo ${foo%t*st} this is a
|
${foo%%t*st} |
удаляет все,что справа от шаблона, включая шаблон |
export $foo="this is a test" echo ${foo#t*is}
|
Замена
В баше имеются 4 оператора инициализации переменных :
Operator |
Function |
Example |
${foo:-bar} |
Если $foo существует и не нуль, возвращает $foo.
Если не существует,или нуль, возвращает bar. |
export foo="" echo ${foo:-one} one echo $foo
|
${foo:=bar} |
Если $foo существует и не нуль, возвращает $foo.
Если не существует, или нуль, устанавливает $foo = bar ,
и возвращает bar |
export foo="" echo ${foo:=one} one echo $foo one
|
${foo:+bar} |
Если $foo существует и не нуль, возвращает bar.
Если не существует, или нуль, возвращает null. |
export foo="this is a test"
echo ${foo:+bar} bar
|
${foo:?"error message"} |
Если $foo существует и не нуль, возвращает его значение.
Если не существует, или нуль, печатает ошибку.
Если нечего печатать, печатает parameter null or not
set . Note:
|
export foo="one"
for i in foo bar baz; do
eval echo \${$foo:?}
one
bash: bar: parameter null or not set
bash: baz: parameter null or not set
|
Debug
Для отладки скрипта можно использовать опцию -nv.
При этом запускаемый скрипт будет читаться и распечатываться , но не исполняться ,
и возможно выявление ошибок :
#!/bin/bash -nv
Следующая функция является аналогом си-шной getch() - возникает пауза до тех пор ,
пока не будет нажата клавиша :
getch () # gets one char from kbd, no "Enter" necessary
{
OLD_STTY=`stty -g`
stty cbreak -echo
GETCH=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
stty $OLD_STTY
}
|
|