bash

зайти в screen на удалённой системе

Tags: •  •  •  •  • 

Требуется: Приатачиться к screen, запущенному на удалённой системе с минимальным количеством телодвижений.

Решение:
Не обязательно, но все таки:
1. делаем беспарольную аутентификацию как рассказно здесь
затем
2.

$ ssh -t login@host 'source .bashrc; screen -x'

Готово!

3. И на последок, что бы все вышеперечисленное таки совершалось с наименьшим количеством телодвижений, создаем скрипт:

$ cat >remotescreen
!#/bin/sh 
ssh -t login@host 'source .bashrc; screen -x'

$chmod 755 remotescreen

3.a ... или делаем алиас в любимом .*shrc
[code]

Сохранение истории команд в bash

Tags: •  •  •  • 

Часто бывает, что мы пользуемся шеллом одновременно из нескольких открытых окон терминала. При этом не менее часто бывает, что удобную и длинную команду из истории шелла из одного терминала случайно затерла история шелла из другого терминала. Избежать этого может помочь добавление следующих строк в .bashrc:

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

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

Быстрый перезапуск команды с дополнительным параметром

Tags: •  • 

В продолжении темы об использовании ссылки на предыдущую команду.
Часто при копировании директорий забываю добавлять флажок -r. Выручает !!.

/media/cd/$ cp SST_SDA /usr/local/dump/tmp
cp: пропуск каталога `SST_SDA'
/media/cd/[1] $ !! -r
cp SST_SDA /usr/local/dump/tmp -r
/media/cd/$

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

Вставка последнего аргумента предыдущей команды в bash и zsh

Tags: •  • 

В bash и zsh в стандартном режиме (он же зовется emasc-режим, это тот который не vi-режим Ж:-)
есть удобное сочетание клавиш Esc-. позвляющее вставлять последнее слово аргументов прошлой команды.

Пример использования. Например прочитали новость о выходе нового релиза игрушки glest и решили глянуть что за зверь такой.

# так как лень, то ищем есть ли в репозитории
$ apt-cache search glest
glest-data - A free 3d real-time customizable strategy game
glest - A free 3D real-time customizable strategy game

# o, есть. смотрим описание и зависимости
$ apt-cache show Esc-.
Package: glest
...
Depends: glest-data (= 3.1.0-1), ..
...
Description: A free 3D real-time customizable strategy game
 Glest takes place in a context which could be compared to that of the
 pre-renaissance Europe, with the licence that magic forces exist in the
 environment and can be controlled.

# ок. устраивает установим 
$ sudo apt-get install Esc-.
Чтение списков пакетов... Готово
Построение дерева зависимостей       
Reading state information... Готово
...

# смотрим что поставилось, какие запусные файлы, есть ли мануалы, README.Debian и что там
$ dpkg -L Esc-.
/.
/usr
/usr/games
/usr/games/glest
...

# ну и запустим
$ Esc-.

Как видно из примера не плохо облегчает жизнь Ж:-)

Если вы используете zsh в vi режиме, то получить эту фичу в режиме вставки можно добавив в свой ~/.zshrc

bindkey -M viins '^[.' insert-last-word

Только учтите что между нажатием Esc и . должно пройти меньше секунды, иначе zsh перейдет в командный режим vi-режима.

Изображение пользователя 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.

Быстрый перезапуск команды под sudo в шелле

Tags: •  •  • 

Правила хорошего тона и безопасности требуют работать под не привилегированным пользователем и пользоваться sudo в случае необходимости. Но тогда часто возникают ситуации подобные этой:

$ tail -f /var/log/messages
tail: невозможно открыть `/var/log/messages' для чтения: Отказано в доступе
tail: больше нет файлов

Быстрый способ перезапуска предыдущей команды в bash и zsh

$  sudo !!

Нелинейные конвейеры

Tags: •  • 

Допустим вам нужно сравнить вывод двух команд с помощью diff. Обычная методика - создание временных файлов, однако это можно сделать и на лету:

$ diff <(date +%M) <(date +%T)
1c1
< 55
---
> 00:55:21

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

Краткий справочник по массовому переименовыванию файлов :-)

Tags: •  •  •  •  •  • 

Иногда нужно производить массовые переименования файлов. Изучая командную строку юникса когда то, меня удивило отсутствие такой приятной возможности в DOS как массовые переименовывания файлов (помню было что то типа copy *.c *.bak).

1. По первому разу я просто в vi создавал множество команд mv производящие нужные действия. Самый очевидный, и самый трудоемкий путь Ж:-)

2. Позже я начал разбираться с командной строкой юникса и мог запрограммировать массовые переименования.

for i in *.c; do
  mv $i `echo $i | sed 's/\.c$/.bak/'`
done

Изображение пользователя 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
    
Изображение пользователя alexu.

Ответы на ЧаВо по программированию в Bash

Tags: •  •  • 

Очень классная подборка вопросов и ответов по программированию в Bash. Не нужно долго ковыряться в Advanced Bash Programming Guide ;)

http://wooledge.org/mywiki/BashFaq

подсветка текста в консоли

Tags: •  •  •  •  •  •  •  • 
Иногда хочется пропустить текст через такой фильтр, как grep, но чтобы он только подсветил совпадения, а не вырезал строки с ними. Можно использовать вот такую функцию, которую безболезненно можно добавить в ваш конфигурационный файл оболочки:
function hilight 
{ 
        ESC=`echo -e "\033"` 

        COLORON="$ESC[1;33m" 
        COLOROFF="$ESC[1;0m" 

        if [ -z "$1" ] ; then 
                echo "Usage: hilight 'regex' [file1 file2 ...]" 1>&2; 
                return 1 
        fi 

        REGEX="$1" 
        shift 

        sed -e "s/${REGEX}/${COLORON}&${COLOROFF}/g" $* 
}
Изображение пользователя ramok.

Редактирование сложных команда в bash и zsh

Tags: •  •  • 

Часто бывает что вам необходимо редактировать сложную команду в шеле. Например написать мини скрипт, или составить список файлов которые выхотите удалить в директории с большим кол-вом файлов и где не подходят маски.

В bash в режиме emacs(установленный по умолчанию) ctrl-x ctrl-e вызодвет редактор прописанный в переменной окружения EDITOR.

В zsh вы можете добится того же эффекта добавив в ~/.zshrc

autoload -U edit-command-line
zle -N  edit-command-line
bindkey -M emacs "^X^E" edit-command-line # для режима emacs
bindkey -M vicmd v edit-command-line      # для командного режима vi

Теперь в режиме emacs будет такоеже поведение как в bash. А в командном режиме vi достаточно нажать v

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

Автоматический запуск ssh-agent

Tags: •  •  •  • 
Ранее было рассказано как настроить ssh-agent для автоматической авторизации приложений работающих с ssh. Если вы не используете X-Windows, то ssh-askpass вам не поможет. Зато можно настроить запуск ssh-agent в вашем шеле.

Идея в том что бы указать сокет ssh-agent с жестко заданным именем, и если ssh-agent незапущен, то запустить его.

добавляем в ~/.zshrc или ~/.bashrc
[ ! -S ~/.ssh/ssh-agent ] && eval `/usr/bin/ssh-agent -a ~/.ssh/ssh-agent`
[ -z $SSH_AUTH_SOCK ] && export SSH_AUTH_SOCK=~/.ssh/ssh-agent

Диалоги в KDE

Tags: •  •  •  • 
Что делать, если хочется красивых окон в bash-скриптах? Использовать kdialog. Ниже приведу пример кода с некоторыми комментариями, по которым понятно, как это использовать. Этот скрипт я использую, чтобы монтировать и отмонтировать шифрованный раздел.

Как раскрасить приглашения bash

Tags: •  •  •  •  • 
Заносится в ~/.bashrc. При выполнении su root меняются цвета.
COLOR1="\[\033[0;36m\]"
COLOR2="\[\033[0;33m\]"
COLOR3="\[\033[0;38m\]"
COLOR4="\[\033[0;32m\]"

if [ "$UID" = 0 ]; then
    # I am root
    COLOR2="\[\033[0;31m\]"
    PS1="$COLOR1[$COLOR1\u$COLOR2@$COLOR1\h$COLOR2:$COLOR4\W$COLOR1]$COLOR2# $COLOR3"
else
    PS1="$COLOR1[$COLOR1\u$COLOR2@$COLOR1\h$COLOR2:$COLOR4\W$COLOR1]$COLOR2\$ $COLOR3"
fi
Изображение пользователя ramok.

отображение hints при старте шела

Tags: •  •  •  •  • 

интересные вещи можно узнавать постоянно, и не обязательно заходить на этот сайт Ж:-P
устанавливаем базу данных hint для debian

$ apt-get install fortune fortunes-debian-hints

прописываем в ~/.bashrc или/и ~/.zshrc

fortune debian-hints

теперь при каждом запуске нового шела можно узнавать чтонибуть интересное Ж:-)

ps
базы данных для fortune могут быть разные, например у меня стоят еще
riddles
fortunes
bofh-excuses
literature

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

быстрая отмена алиасов в bash и zsh

Tags: •  •  •  •  • 

могут быть алиасы которые по имени совпадают с программой
например
less='~/bin/less.sh'
ls='ls -FA --color=auto'
vi=vim

но иногда надо запустить программу, а не алиас. временно отменить выполнение алиаса можно так
\ls

alias и функции, как средство настройки оболочки по себя

Tags: •  •  •  •  • 

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

Как сделать работу с историей команд в bash приятнее

Tags: •  •  • 

Для людей, которые большую часть команд выполняют в командной оболочке, удобство работы с историей набранных команд имеет большое значение. Но не все знают, каким образом можно управлять этой историей. Рассмотрим опции по управлению историей в оболочке bash.

поиск набранных команд in zsh-style в bash

Tags: •  •  • 

стандартный способ поиска по истории команд для оболочки bash (как, впрочем, и других программ, использующих libreadline) ([CTRL+r]) довольно неудобен, т.к. он производит поиск только в одну сторону.
а иногда хочется просмотреть все команды, которые начинаются указанным образом.

RSS-материал