sh

создание собственных стартовый скриптов в debian

Tags: •  •  •  • 

для написания стартовых скриптов в debian по совету ramok можно использовать темплейт /etc/init.d/skeleton, предварительно прочитав /etc/init.d/README

Изображение пользователя ramok.

Как узнать размеры терминала в скрипте

Tags: •  •  •  • 

Иногда полезно узнать размеры терминала в котором работает ваш скрипт (например при использовании dialog).

0. По умолчанию терминалы под X-Window устанавливают размеры терминалов в переменные LINES и COLUMNS.
Но к сожалению в скрипты они не экспортятся Ж:-(

1. Можно воспользоватся программой stty, если она поддерживает параметр size

$ stty size
71 159
$ eval `stty size | sed -e 's/\(.*\) \(.*\)/LINES=\1 COLUMNS=\2/'`
$ echo $LINES $COLUMNS
71 159
$

2. Если на машине установлен ncurses (а сейчас сложно тайти машину на которой он не стоит Ж:-)
то можно воспользоваться программой tput.

COLUMNS=`tput cols`
LINES=`tput lines`

3. Если на машине установлен X-Window, то можно воспользоваться командой resize которая возвращает
код на sh для установки переменных LINES и COLUMNS.

$ resize
 COLUMNS=159;
 LINES=71;
 export COLUMNS LINES;
$ eval `resize`
$ echo $LINES $COLUMNS
71 159
$

Изображение пользователя ramok.

Маска для дот-файлов

Tags: •  •  • 

Иногда возникает необходимость скопировать все файлы настройки из домашней директории (так называемые дот-файлы, так как они начинаются с точки) куда нибуть в другую директорию или залить на другую систему. Казалось бы чего проще?

 cp -r .* backup-dir

То есть .* говорит "любое имя файла или директории начинающиеся с точки". Но тут есть подвох. Дело в том что в каждой директории есть две директории с именами . и .., что обозначает "текущая директория" и "родительская директория" соответсвенно.
 cp -r .??* backup-dir

То есть .??* говорит "любое имя файла или директории начинающиеся с точки и содержащая не меньше двух символов". Хотя конечно эта маска не охватывает файлы короче трех символов. Лично я часто пользуюсь этой маской, потому что она применима для большинства случаев и короткая Ж:-)

Спасибо darkk-у, подсказал правильную sh маску .[^.]*

Самая правильная маска для этого выглядит в zsh так:

cp -r .*~(.|..)(^@) backup-dir

.* "все файлы начинающиеся с точки"
~ "отрицание,все маски что идут после ~ не влючены в результат"
(.|..) "имя файлов . или .."
(^@) "не символические ссылки"

ну или еще более правильная для копирования дот-файлов из домашней директории

cp -r ${HOME}/.*~${HOME}/(.|..)(^@) backup-dir

PS
как это выглядит в bash?

Изображение пользователя ramok.

Цифровые аргументы для dd в шеснадцатиричном виде

Tags: •  •  •  •  • 

Как ни странно утилита dd не поддерживает цифровые аргументы в шеснадцатиричном виде, хотя часто бывает нужно указать смещение или размер блока в более удобном для этого шеснадцатиричном виде. Более того в зависимости от аргумента, если передать число в шеснадцатиричном виде, в С нотации, то dd может или закончится ошибкой или проинтерпретировать как 0. Например:

$ dd bs=0x1
dd: неверный номер `0x1'
$  dd count=0x1
0+0 записей считано
0+0 записей написано
 скопировано 0 байт (0 B), 1,248e-05 секунд, 0,0 kB/s

Изображение пользователя ramok.

Запуск команды climm во всех аккаунтах

Tags: •  • 

К сожалению встроенной возможности запускать команду climm во всех аккаунтах climm нет, но можно дописать необходимое Ж:-)

1. Качаем скрипт

 $ wget http://rusmafia.org/linux/files/climm-global-cmd.txt -O climm-global-cmd

2. Копируем его в директорию ~/bin и даем право на исполнение

 $ cp climm-global-cmd ~/bin && chmod +x ~/bin/climm-global-cmd

3. В любимом редакторе изменяем в скрипте переменную CONN_NUM в которой нужно через пробел перечислить все соединения в которых мы хотим выполнять команды.
Номера соединений можно подсмотреть в climm командой conn.

4. В climm создаем алиас 'g' (от "global") в котором вызываем скрипт и не забываем сохранится.

 climm> alias auto g !~/bin/climm-global-cmd
 climm> save

5. Используем макрос. Например перейдем во всех аккаунтах в away

 climm> g away

Посмотреть кто в онлайне во всех аккаунтах
 climm> g e

Вертикальная конкатенация файлов

Tags: •  • 

Склеивание столбцов данных из файлов 1.txt и 2.txt, с разделителем пробел, производится командой:

   
$ paste -d " " 1.txt 2.txt > 3.txt
$ cat 1.txt
1 1
2 2
3 3
$ cat 2.txt
4
5
6
$ cat 3.txt
1 1 4
2 2 5
3 3 6

Либо можно сделать так:

$ paste -s -d " " 1.txt 2.txt > 3.txt
$ cat 3.txt
1 1 2 2 3 3
4 5 6

Статья взята отсюда http://www.opennet.ru/tips/info/1460.shtml

Изображение пользователя ramok.

Сколько строчек в файле?

Tags: •  •  • 

Так как узнать сколько строк в файле? Как всегда в Unix есть множество способов это узнать Ж:-)

ramok@~/ wc -l .zshrc
724 .zshrc
ramok@~/ cat .zshrc | wc -l
724
ramok@~/ sed -ne '$=' .zshrc
724
ramok@~/ awk 'END{print NR}' .zshrc
724
ramok@~/ grep -c "" .zshrc
724
ramok@~/ printf "G\n=\n" | ed -s .zshrc 2> /dev/null
724

Изображение пользователя ramok.

Использование команды перенаправления без команды

Tags: •  •  •  • 
В sh совместимых шелах есть такая возможность создавать файлы пустого размера или обнулять существующие:
# если файла tmp.txt не существовало, создается файл нулевого размера
sh% ~/ > tmp.txt  
sh% ~/ ls -l tmp.txt 
-rw-rw-r-- 1 ramok ramok 0 2007-06-09 11:33 tmp.txt

# если файл tmp.txt существовал, то файл обнуляется
sh% ~/ echo 123 > tmp.txt 
sh% ~/ ls -l tmp.txt         
-rw-rw-r-- 1 ramok ramok 4 2007-06-09 11:33 tmp.txt
sh% ~/ > tmp.txt 
sh% ~/ ls -l tmp.txt
-rw-rw-r-- 1 ramok ramok 0 2007-06-09 11:33 tmp.txt
В zsh это идея, как всегда, более развита Ж:-) Существуют переменные окружения NULLCMD и READNULLCMD, по умолчанию установленные в cat и more соответственно. Что позволяет такие дополнительные возможности:
# аналог cat > tmp.txt. ничего не вводим, сразу жмем ctrl-d
# получаем файл нулевого размера.
ramok@~/ > tmp.txt  
^D
ramok@~/ ls -l tmp.txt 
-rw-rw-r-- 1 ramok ramok 0 2007-06-09 11:33 tmp.txt

# аналог cat > tmp.txt. вводим то что нужно внести в файл и жмем ctrl-d
ramok@~/ > tmp.txt  
123
^D
ramok@~/ ls -l tmp.txt         
-rw-rw-r-- 1 ramok ramok 4 2007-06-09 11:33 tmp.txt

# аналог cat >> tmp.txt. вводим то что нужно добавить в файл и жмем ctrl-d
ramok@~/ >> tmp.txt  
456
^D
ramok@~/ ls -l tmp.txt         
-rw-rw-r-- 1 ramok ramok 8 2007-06-09 11:33 tmp.txt

# аналог more < tmp.txt
ramok@~/ < tmp.txt  
123
456

Естественно можно установить NULLCMD и READNULLCMD в свои значения, например в true и less соответственно. Или придумать что-нибудь лучшее Ж:-)

PS

и кой чего в нагрузку Ж:-) в шеллах есть встроенная команда :, аналог команда true, которую тоже можно использовать для создания/обнуления файлов более коротким способом, чем echo -n > файл:

ramok@~/ :> tmp.txt 
ramok@~/ ls -l tmp.txt 
-rw-rw-r-- 1 ramok ramok 0 2007-06-09 11:33 tmp.txt
    
Изображение пользователя ramok.

Вывод отладочной информации в скриптах shell

Tags: •  •  • 

При отладке скрпитов sh часто очень удобно видеть какие команда выполняется в результате работы скрипта. Включить вывод отладочной информации в скрипте можно командой:

set -x
Если скрипт большой и хочется выводить отладочную информацию только для проблемного куска кода, то отключить вывод можно командой:
set +x

Изображение пользователя ramok.

перевод чисел между 10 и 16-тиричными системами исчисления в консоли

Tags: •  •  •  •  • 

#1) sh

$ printf "%x\n" 29
$ printf "%d\n" 0x2c
$ let 0xff     # в OpenBSD не работает, в GNU и FreeBSD работает
$ echo $((16#2c)) # в FreeBSD не работает, в GNU и OpenBSD работает
$ echo $((0xff)) и echo $((077))

#2) bc

$ echo "obase=16;29" | bc
$ echo "ibase=16;2C" | bc

#3) dc

$ echo 29 | dc -e "16o?p"
$ echo 2C | dc -e "16i?p"

#4) awk

$ echo 29 | awk '{printf "%x\n", $0}'
$ echo 0x2c | awk '{print strtonum($0)}'

#5) perl

$ echo 29 | perl -ne 'printf "%x\n", $_'
$ echo 2c | perl -ne 'print hex $_'

я знаю есть еще множество способов, предлагайте еще! Ж:-)
как минимум редствами bash, zsh, sed (видел и такое Ж:-)

как посчитать сумму чисел в выводе программы

Tags: •  •  •  •  • 

довольно часто возникает необходимость посчитать сумму чисел в выводе какой-либо программы.
например, если сделать grep pppd /var/log/daemon.s | grep -Po '(?&lt;=received )\d+', то можно получить что-то вроде

994
3301302
259550
4825
91793
103160
171276
58533
2563

это число байт, принятых по модему за несколько последних сессий. просуммировать такой вывод очень просто. достаточно создать скрипт, содержащий всего две строчки:
#!/bin/sh
awk '{print $1}' | grep -Po '^\d+([.,]\d+)?' | sed -n '{s/$/+/;s/,/./;H;}; ${g;s/\n//g;s/+$//g;p}' | bc

назвать его, скажем, sum, а потом сделать

Изображение пользователя ramok.

Перевод шеснадцатиричного представления IP в стандартную форму в конс

Tags: •  •  •  •  •  •  •  •  • 

перевод hex IP -> dec IP

1) bash only by ams

$ i=ffffffc0; echo $((0x${i:0:2})).$((0x${i:2:2})).$((0x${i:4:2})).$((0x${i:6:2}))

2) так короче но $[] dericated

$ i=ffffffc0; echo $[0x${i:0:2}].$[0x${i:2:2}].$[0x${i:4:2}].$[0x${i:6:2}]

3) тоже вроде только для bash как имеющий опцию -n в read

$ echo ffffffc0 | while read -n 2 D; do [ -z $D ] || printf "%d." 0x$D; done; echo

4) sh+sed

$ printf "%d.%d.%d.%d\n" `echo ffffffc0 | sed 's/\(..\)\(..\)\(..\)\(..\)/0x\1 0x\2 0x\3 0x\4/'`

5) тоже но немного разбираясь в sed Ж:-)

$ printf "%d.%d.%d.%d\n" `echo ffffffc0 | sed 's/\(..\)/0x\1 /g'`

6) printf only by ams. но это только смотреть, пайпы не пройдут Ж:-)
[code]

RSS-материал