Home
Just Another Sysadmin's blog (просто еще один блог сисадмина)
System log
Recent Entries 

Advertisement

Customize
stasikos@stasikos-laptop:~$ cat test.sh 
#!/bin/bash

if [ "A$1" = "AA" ] ; then
echo "A!"
else
echo "B!"
fi
stasikos@stasikos-laptop:~$ sh -x test.sh A
+ [ AA = AA ]
+ echo A!
A!
stasikos@stasikos-laptop:~$ sh -x test.sh
+ [ A = AA ]
+ echo B!
B!
stasikos@stasikos-laptop:~$


Аналогично можно вставить set -x или set +x в любом месте скрипта, чтобы включить или выключить отладку.

Very useful, как говорится.

Это кросспост, оригинал сообщения здесь
После применения предыдущего типса про "вечную" историю команд в bash, пользователи mc находят мусор в своих файлах истории. Мусором туда гадит mc.
Этот мусор выглядит примерно так:
  414  mc
  415   PROMPT_COMMAND='pwd>&7;kill -STOP $$'
  416   cd "`printf "%b" '\0057home\0057stasikos\0057video\0057FLV\0057MOBILE'`"
  417   cd "`printf "%b" '\0057home\0057stasikos'`"

Единственное избавление от этого - заигнорить те строки, которые он туда добавляет:
(в .bashrc)
export HISTIGNORE="&:ls:[bf]g:exit: cd \"\`*: PROMPT_COMMAND=?*?"


via коммент у Tigra.info

P.S. (UPD) а еще там же, у тигро.инфо, есть намного более красивое решение
export HISTCONTROL=ignoreboth

которое можно добавить как в .bashrc, так и в bashrc для mc, который находится в ~/.mc/bashrc. Это аналог "ignorespace + ignoredups", который не дает задваивать команды в history и не добавляет туда команды, начинающиеся с пробела.

Кстати, отсюда выплывает еще один типс - при включении этой опции в своем ~/.bashrc, можно намеренно поставить пробел перед командой и она не сохранится в истории. Вдруг она конфиденциальна. )
как-то захотелось просмотреть абстрактный jpeg из домашнего каталога программой display.

Ну, как обычно, тыкаю
$ display <tab>

И понимаю, что что-то тут не так, и выбирать из 200-300 файлов любой жпег не очень-то удобно.

Роемся в man bash. )
$ display *.jpg<Esc-g> 

(или Alt-g, или Ctrl-x, g - для просто списка без дополнения)

Нажатием Ctrl-x * можо и вовсе вместо табкомплита поместить все имена файлов по маске в командную строку.
Обычно, если не указывать значение параметра -c, ping посылает icmp echo до тех пор, пока не будет завершен, например, с помощью Ctrl-C:
0):stasikos@zombie:~$ ping ya.ru
PING ya.ru (213.180.204.8) 56(84) bytes of data.
64 bytes from ya.ru (213.180.204.8): icmp_seq=1 ttl=57 time=760 ms
64 bytes from ya.ru (213.180.204.8): icmp_seq=2 ttl=57 time=703 ms
64 bytes from ya.ru (213.180.204.8): icmp_seq=4 ttl=57 time=2391 ms
64 bytes from ya.ru (213.180.204.8): icmp_seq=5 ttl=57 time=1465 ms

--- ya.ru ping statistics ---
6 packets transmitted, 4 received, 33% packet loss, time 5399ms
rtt min/avg/max/mdev = 703.354/1329.923/2391.067/682.176 ms, pipe 3
Но однажды мне захотелось странного. Поставить ping с интервалом поболее, да на долгое время, чтобы оценить этот самый packet loss в больших масштабах. Ну и смотреть статистику, не тыкая каждый раз ctrl-c и не перезапуская его снова.
"Shorter current statistics can be obtained without termination of process with signal SIGQUIT." - гласит man ping. Посему...
0):stasikos@zombie:~$ ping -q -i 2 ya.ru
PING ya.ru (213.180.204.8) 56(84) bytes of data.
(^Z)
[1]+  Stopped                 ping -q -i 2 ya.ru
1):stasikos@zombie:~$ bg %1
[1]+ ping -q -i 2 ya.ru &
1):stasikos@zombie:~$ kill -QUIT %1
6/2 packets, 66% loss, min/avg/ewma/max = 609.963/740.967/839.220/871.972 ms
Опцию q я указал, чтобы строки, которые выводит ping, не мешали работе в шелле, пока ping работает в фоне.
UID - это уникальный в пределах системы идентификатор пользователя. Представляет собой целое число.
Узнать его можно многими способами:
$ id 
uid=1000(stasikos) gid=1000(stasikos) группы=8(mail),20(dialout),24(cdrom),25(floppy),29(audio),44(video),
46(plugdev),1000(stasikos)
s
uid=1000 дает нам полное знание о собственном uid ).
$ id root
uid=0(root) gid=0(root) группы=0(root)
эта же команда дает нам возможность узнать и чей-то еще uid.
UID = `id -u`
В скрипте значение только текущего uid можно получать именно таким способом.
Кроме того, uid хранится в /etc/passwd:
$ getent passwd | grep stasikos
stasikos:x:1000:1000:Stanislav V. Kogut,,,:/home/stasikos:/bin/bash
Для изменения uid пользователя нужно воспользоваться командой usermod:
# usermod -u 1099 test
Но если все-таки uid пользователя в системе изменился вручную через редактирование /etc/passwd, это можно исправить, сделав пользователя владельцем его старых файлов и каталогов, которые ранее принадлежали этому пользователю, станут чужими, поэтому их нужно будет передать ему снова:
# find / -uid $OLD_UID -exec chown $username {} \;
Впрочем, эта команда может спасти и в случае, если пользователь владеет файлами за пределами своего домашнего каталога.
Задать uid при создании пользователя можно, указав ключ --uid для команды adduser.
P.S. А нафига это все? А это так, чтобы посмотреть, часто ли этот вопрос кого-то интересует.
Часто бывает, что мы пользуемся шеллом одновременно из нескольких открытых окон терминала. При этом не менее часто бывает, что удобную и длинную команду из истории шелла из одного терминала случайно затерла история шелла из другого терминала. Избежать этого может помочь добавление следующих строк в .bashrc:

shopt -s histappend
PROMPT_COMMAND='history -a; history -n'


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

("Кросспост" с Полезные советы по Linux)
Родил настраиваемый скрипт для почтового сервера со smarthost и imap, чтобы архивировать старую почту. Раньше работало куда более коряво, ныне вот так. (единственное - если пользователей много, придется долго записывать mbox-ы в список)
#!/bin/bash

OPATH="/var/archives/mail"
for i in `cat /etc/mailboxes | awk '{ printf "%s|%d\n", $1, $2} '`; do
	MPATH=`echo $i | awk -F '|' '{print $1}'`
	DAYS=`echo $i | awk -F '|' '{print $2}'`
	OWNER=`stat -c %U $MPATH`
	PSUFFIX=`dirname $MPATH`
	if [ ! -d "$OPATH$PSUFFIX" ] ; then 
	 	mkdir -p "$OPATH$PSUFFIX"
	fi
	chmod 700 "$OPATH$PSUFFIX"
	chown $OWNER:mail "$OPATH$PSUFFIX"
	archivemail -d $DAYS -o "$OPATH$PSUFFIX" "$MPATH"
done

Advertisement

Customize
This page was loaded Nov 29th 2009, 12:31 pm GMT.