スキップしてメイン コンテンツに移動

投稿

ラベル(shell script)が付いた投稿を表示しています

shの設定: emacsclient.sh

emacs-serverとemacsclientを使って,1つのemacsウィンドウを有効に利用する方法.指定したファイルを,emacs-serverを立ち上げているemacsウィンドウで開く.これにより,emacsウィンドウの乱立を防ぎ,すっきりとしたデスクトップで生活できる. シェルの初期化スクリプトに,以下のスクリプトを加える. e() { file=$1 echo $1 | grep -v '^/' >/dev/null 2>&1 && file=${PWD}/$file emacsclient -e "(find-file \"${file}\")" } unset file ターミナルから, $ e filename と実行することで,既に立ち上がっているemacsウィンドウでファイルを開く.

ディレクトリを自動バックアップする

概要 backup.sh 特定のディレクトリ以下を毎日バックアップしたいことがある.これを自動化するスクリプトを書いたので紹介する. ここでは,バックアップの管理をシンプルにすることを目標としている.このため,増分バックアップなどの高度なものは使用せず,tarで固めて圧縮するに留めている. コード 以下にコードを示す. #!/bin/sh init() { MAX_BACKUPS=20 DST_DIR=~/var/log/svn.repos/ DST_FILE=$DST_DIR/`date +%F`.tar.gz MYNAME=$0 mkdir -p $DST_DIR } chkarg() { while [ $# -ne 0 ]; do case $1 in *) SRC_DIR=$1 shift ;; esac done if [ ! -d $SRC_DIR ]; then echo backup-dir $SRC_DIR not found. exit 1 fi } backup() { tar czf $DST_FILE -C `dirname $SRC_DIR` `basename $SRC_DIR` i=0 for fname in `ls $DST_DIR/????-??-??.tar.gz | sort -r`; do [ $i -ge $MAX_BACKUPS ] && rm -f $fname i=`expr $i \+ 1` done } synopsys() { echo hoge } main() { init $* chkarg $* backup } main $* 使い方 シノプシス $ backup.sh directory 引数にはバックアップする対象のディレクトリを指定する.このディレクトリ以下の全ファイルがバックアップの対象となる. 設定項目 上記コードのinit(...

ssh-agentの管理を自動化する

ssh-start.sh ssh-agentの管理を自動化するスクリプトssh-start.shを紹介する. 詳細 ssh-agentを使うことで,sshでリモートログインする際に,パスワードの入力を省略できる. ssh-agentを利用するためには,ソケットのパスとプロセスIDを環境変数に登録する必要がある.環境変数に登録すべき情報は,ssh-agentの起動時に,以下のように標準出力に出力される. $ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-XTqIvn4918/agent.4918; export SSH_AUTH_SOCK; SSH_AGENT_PID=4919; export SSH_AGENT_PID; echo Agent pid 4919; 上記のように,ssh-agentの出力はシェルコマンドとなっており,実行すれば環境変数がセットされる.このため,多くの解説記事では,次のようにevalを用いる方法が述べられている. $ eval `ssh-agent` Agent pid 4919 しかし,この方法は,同じssh-agentのプロセスを複数のシェルから利用することはできない.上記コマンドを他のシェル上でも実行すれば,動作はするが,次の点で優れた手法とは言えない. ssh-agentのプロセスを複数起動する (本来は1個で充分). 起動毎に秘密鍵の登録,およびパスフレーズの入力が必要となる. 上記の問題は解決するには,1個のssh-agentを複数のシェルから再利用すればよい.例えば2個のターミナルから1個のssh-agentプロセスを利用するには,次のようにする. # terminal 1 $ ssh-agent > ~/tmp.sh $ source ~/tmp.sh Agent pid 4919 # terminal 2 $ source ~/tmp.sh Agent pid 4919 こうすることで,2個のターミナルから同一プロセスのssh-agentを利用できる. 以上の処理を自動化したものが,ここで紹介するスクリプトである. 使い方 環境変数を扱かうため,通常のスクリプトのようには利用できない.このため,sourceコマンドや.(ドット)コマンドで実行する. $ source /path/to/dir/s...

シェルスクリプトの便利な小技

文字列操作 文字列の長さを取得する   書式: ${#name}   変数nameの文字列の長さを返す. $ HOGE=hoge $ echo ${#HOGE} 4 変数の修正 部分文字列を削除 数値で指定する   書式: ${name:number}   変数nameの文字列の先頭からnumberで指定した文字数を削除する. $ HOGE=hoge $ echo ${HOGE#3} e パターンマッチを使う   書式: ${name#pattern}(最短マッチ) ${name##pattern}(最長マッチ)   変数nameの文字列の先頭から文字列patternにマッチした部分を削除する. $ HOGE=hoge $ echo ${HOGE#ho} ge 置換 パターンマッチを使う   書式: ${name/pattern/repl}(一度限り) ${name//pattern/repl}(繰り返しあり)   変数nameの文字列とpatternで指定した文字列が一致した部分をreplで指定した文字列に置き換える.