PostgreSQL coub express.js freeware git jquery laravel links linux macos mysql node.js php powershell python ubuntu vim virtualbox анекдот блог игры интересно стихи цитаты

Врядли это для кого-то открытие конечно, но тем не менее.
У mkdir (man mkdir) есть ключик -p который позволяет создавать довольно интересные структуры подпапок одним движением. Например
mkdir -p ./one/two/three
создаст три вложенных друг в друга папки внутри текущей директории.
Можно сделать несколько интереснее
mkdir -p ./one/{two1,two2,two3}/three
что даст нам такую структуру (допустим что мы запускали это все из домашней папки)
~/one/two1/three
~/one/two2/three
~/one/two3/three
Ну и ещё раз если вдруг кто не понял что происходит
mkdir -p ./one/{two1,two2,two3}/{th1,th2,th3}
Создает такую структуру
~/one/two1/th1
~/one/two1/th2
~/one/two1/th3
~/one/two2/th1
~/one/two2/th2
~/one/two2/th3
~/one/two3/th1
~/one/two3/th2
~/one/two3/th3
Ну и понятное дело фигурные скобки можно использовать не только с mkdir, в этом примере мы чистим папки с кешем и логами для трех типовых проектов лежащих в текущей папке
#!/bin/bash
rm -rf {proj1,proj2,proj3}/{logs,cache}/*


Пример рекурсивно ищет файлы с расширением .php в выбранной директории, читает их и считает в них строки.
cd ~/projects/project
find . -type f -name *.php -exec cat {} \; | wc -l


Маленькие "хитрости" bash. На примере перезапуска приложения node.js
#!/bin/bash
# чтобы было легче жить, добавим все нужные пути в переменные
DAEMON="/usr/local/bin/node"
ROOT_DIR="/home/user/project-copy-folder"
# тут на основании базовых путей выставляем пути к файлам PID, 
# логов и скрипта, запускающего само приложение
PIDFILE="$ROOT_DIR/pidfile"
SERVER="$ROOT_DIR/app.js"
LOG_FILE="$ROOT_DIR/app.js.log"

# останавливаемся, обратите внимание на то, как получается и обрабатывается PID
echo -n "Stopping $SERVER: "
kill -9 $(cat $PIDFILE) && echo 'ok stoped' || echo 'error on stop my-funny app'

# чистим логи и убираем старый PID (это опционально)
>$LOG_FILE
>$PIDFILE

# стартуем. тут самое как мне кажется, непонятное — это конструкция echo $! > $PIDFILE
# здесь $! это PID последнего запущенного приложения (читаем ман по bash), с пониманием
# этого нюанса становится понятно все остальное
echo -n "Starting $SERVER: "
`$DAEMON $SERVER > $LOG_FILE & echo $! > $PIDFILE &` && echo 'ok, started' || echo 'error on start my-funny app'
Интересная особенность как мне показалось состоит в том, что если мы выполним например вот такой код
/usr/local/bin/node /home/user_name/project/app.js &
echo $!
То увидим напечатанный PID. А вот если исполнить тоже самое, но через eval
NODE='/usr/local/bin/node'
APP='/home/user_name/project/app.js'
`$NODE $APP &`
echo $!
То не увидим ничего. То есть eval где-то у себя это значение закусывает и нам оно нормально не доезжает. Соответственно решением (скорее всего одним из решений, так как я никакой не специалист по bash), будет получение PID-а прямо внутри этого самого eval-a как показано в первом примере.

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


Мне это понадобилось для автоматического подъема сервиса после внештатной перезагрузки сервера.
Как всегда, все просто:
su USER -c '/home/USER/folder/script.sh'
Собственно man su рассказывает всё в примерах.
su man -c catman
# Runs the command catman as user man.  You will be asked for man's password unless your real UID is 0.

su man -c 'catman /usr/share/man /usr/local/man'
# Same as above, but the target command consists of more than a single word and hence is quoted for use 
# with the -c option being passed to the shell.  (Most shells expect the argument to -c to be a single word).

su -l foo
# Simulate a login for user foo.

su - foo
# Same as above.


Наконец это случилось и со мной. Я умудрился забыть пароль от ноута.
Слава зайцам восстановить доступ в убунте довольно просто. Я раза с третьего нагуглил нормальное решение.
На всякий случай здесь тоже напишу.
  • При загрузке системы удерживая Shift попадаем в меню Grub, из него входим в режим восстановления (он же "recovery mode", через "доп параметры" в 12.10 на других могут быть различия)
  • Далее при загрузке появится меню режима восстановления, в нем выбираем строку root (в 12.10 "root - Drop to root shell prompt")
  • Откроется рутовая консоль, теперь чтобы изменить пароль надо перемонтировать файловую систему для записи, выполняем команду
    mount -rw -o remount /
  • Если забыли ещё и логин то можно выполнить
    cat /etc/passwd
    В появившемся выводе поискать знакомые имена пользователей :)
  • Теперь собственно меняем пароль
    passwd userName
    Где UserName - логин пользователя, для которого меняется пароль.
  • Теперь перезагружаемся
    shutdown -r now
  • Profit!


aghr