Bash тулы

Tags:

А давайте я напишу немного про bash. Вроде бы про него не писал еще, хотя юзаю.

Bash -- это такой язык командной оболочки. В большинстве юникс-систем по умолчанию используется именно он. Хотя полно и других языков, zsh, например, клевая штука (но я не использую).

С его помощью можно, во-первых, повелевать консолью, во-вторых, автоматизировать все подряд, в-третьих, делать для себя всякие нужные тулы.

Инфы по bash в инете море, тема раскрыта исчерпывающе. Но я напишу про то, как я повелеваю консолью, чего автоматизирую, и какие тулы себе сделал.

Повелеваем консолью

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

svn revert --depth infinity

ибо слишком много букв. Хорошо бы обойтись 5-10 буквами, а лучше двумя.

Ну не вопрос, для этого есть альясы:


# working with file system
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
alias rm='rm -i'
alias rmf='rm -rf'
alias rmt='rm -rf temp'
alias cp='cp -ir'
alias mv='mv -i'
alias mkdir='mkdir -p'
alias cdy='cd /mnt/2send/yura'

# working with subversion
alias ss='svn status'
alias su='svn update --set-depth=infinity'
alias sc='svn commit -m '
alias si='svn propedit svn:ignore '
alias sd='svn diff -r HEAD '
alias sr='svn revert --depth infinity '
alias srw='svn resolve --accept=working '
alias sm='svn merge '
alias check='find . -maxdepth 1 | xargs svn status'
alias rmsvn='find . -name .svn | xargs rm -rf'

# working with git
alias gs='git status'
alias ga='git add'
alias gc='git commit -m '

# working with maven
alias mi='mvn install -Dmaven.test.skip=true'
alias mci='mvn clean install'

# search
alias gg='find . -name \*as -o -name \*mxml | xargs grep'
alias ggg='find . -name \*java -o -name \*scala | xargs grep'
alias gggg='find . -type f | xargs grep'

Автоматизируем все подряд

В первую очередь -- бэкап данных. Скрипт приводить не буду, ибо во-первых, он большой. Во-вторых, он тупой -- просто берем файлы из одних мест и копируем в другие. Запускаем по крону, и все дела.

Еще неплохо бы автоматизировать монтирование внешних файловых систем. Линукс мой живет в чужеродном окружении, кругом винда. И нужно монтировать разные каталоги разных виндовых машин к себе. А чтобы сделать это правильно, нужна длинная и скучная команда.

Посему пихаем все это дело в скрипт и запускаем его на старте (ну или когда понадобится).


#!/bin/bash

function mount_environment
{
        RESOUCE=$1
        MOUNT_POINT=$2

        mount -t cifs $RESOUCE $MOUNT_POINT \
        -o user=your_windows_login,pass=your_windows_pass \
        -o uid=yura,gid=yura \
        -o file_mode=0644,dir_mode=0755
}

mount_environment //192.168.0.101/2send /mnt/2send
mount_environment //192.168.0.102/backup /mnt/backup
mount_environment //192.168.0.102/projects /mnt/projects
mount_environment //192.168.0.102/fms/ /mnt/fms

Ну и никто не запрещает использовать bash для автоматизации сборки проектов. Тут уж можно на низком уровне сделать чего угодно, и даже такого, чего не умеют делать Ant и Maven. Одна только беда -- сборщик будет не кроссплатформеный. Так что если у вас в команде нет разработчиков, использующих винду, то welcome :) Хотя, в принципе, bash и под виндой можно юзать.

Всякие нужные тулы

Для разминки генерилка паролей


#!/bin/bash

LENGTH=$1
if [ -z $LENGTH ]; then LENGTH=10; fi

echo `</dev/urandom tr -dc A-Za-z0-9 | head -c$LENGTH`

А теперь клевая штука -- скрипт, показывающий статистику по проекту -- сколько в нем файлов и строк кода.

Довольно странно, что ни Eclipse, ни Intellij IDEA такую статистику показывать не умееют. (Или умеют, но я об этом не знаю). А ведь хочется знать :)


#!/bin/bash

DIR=$1
if [ -z $DIR ]; then
	DIR=`pwd`
fi

cd $DIR

C=0
L=0
function sum
{
	N=`wc -l $1 | cut -d' ' -f1`
	C=$(($C + 1))
	L=$(($L + $N))
}

function stat()
{
  HINT=$1
  FILTER=$2
  
  C=0
  L=0
  for i in $( $FILTER ); do
    sum $i
  done
  echo "$HINT classes:$C lines:$L"
}

stat 'Java:' 'find . -name *.java'
stat 'Flex:' 'find . -name *.as -o -name *.mxml'
stat 'FMS:' 'find . -name *.asc'
stat 'PHP:' 'find . -name *.php'
stat 'html/js:' 'find . -name *.js -o -name *.htm -o -name *.html'
stat 'Erlang:' 'find . -name *.erl -o -name *.hrl'
stat 'Scala:' 'find . -name *.scala'
stat 'Groovy:' 'find . -name *.groovy'

С помощью этого скрипта можно узнать о своем (или чужом) проекте что-то такое:

yura ~/p/rtmp-service-mate-ext $ code_stat
Java: classes:3 lines:196
Flex: classes:17 lines:1155
FMS: classes:2 lines:69
PHP: classes:0 lines:0
html/js: classes:9 lines:1629
Erlang: classes:0 lines:0
Scala: classes:0 lines:0
Groovy: classes:0 lines:0

yura ~/p/flex-logging-console $ code_stat
Java: classes:0 lines:0
Flex: classes:16 lines:767
FMS: classes:0 lines:0
PHP: classes:0 lines:0
html/js: classes:9 lines:1629
Erlang: classes:0 lines:0
Scala: classes:0 lines:0
Groovy: classes:0 lines:0

yura ~/stuff/bigbluebutton $ code_stat
Java: classes:672 lines:90429
Flex: classes:279 lines:23588
FMS: classes:0 lines:0
PHP: classes:11 lines:1344
html/js: classes:68 lines:39609
Erlang: classes:0 lines:0
Scala: classes:12 lines:1131
Groovy: classes:86 lines:5238

enjoy :)

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
question for bots )
Image CAPTCHA
Enter the characters shown in the image.