tmuxでアクティブ・非アクティブなPaneの色を変化させる

tmuxでPaneを使う際、アクティブ・非アクティブなPaneで色が同じで、今どのPaneを操作しているのかわかりにくい事がある。 で、tmuxではtmux.confに設定を記述することで、アクティブ・非アクティブなPaneの色を変更できる機能があるらしい。borderで太字の文字についても色を指定できる。 以下、設定例。


tmuxでpaneの色(文字色・背景色)を変更する

時折、ターミナルの背景色や文字の色などを環境や状況に応じて静的・動的に簡単に変更できたりしないかなーと考えたりする。 で、なんか方法あるのかなと調べてみたところ、tmuxの2.1からならpaneごとに背景色などを変更できるらしい。もちろんtmuxなので、デフォルト設定しておけば静的にもできるし、使用中でもpaneの色が変更できる。

動的にpaneの色を変更する場合は、プレフィックスキーの入力後、以下のようにコマンドを実行する。 「-t:.n」にはpaneの番号を入れる。

:select-pane -t:.0 -P 'fg=cyan,bg=black'

Twitterをボケーッと眺めてたところ、そんな感じの処理についてを見かけたので、処理方法についてを残しておく。 sedでは、以下のように指定することで指定行の範囲(以下の例では、n~m行目)でのみ処理を行わせる事が可能となっている。

sed 'n,m s/$/*/g'
blacknon@BS-PUB-UBUNTU-01:~$ seq 10 | sed '2,4 s/$/*/g'
1
2*
3*
4*
5
6
7
8
9
10

で、今回はこの範囲指定を複数(例えば2,4と6,8)指定して、同じ処理を行わせようという内容。 個人的には、こういった場合はブレース展開を利用する方法を...


たまに、awkでパースした要素を使ってOSのコマンドを実行させたりすることがある。 で、さらにOSのコマンドだけではなく、さらにawkの処理を組み合わせてやりたいことがある。そういう時、ただ単にOSのコマンドを実行後に処理を記述すると、実行されるタイミングの違いによって意図した結果が得られない場合がある。

blacknon@BS-PUB-UBUNTU-01:~$ # 先にrevを実行しているが、処理速度の違いから後から実行しているprintが先に出力されている
blacknon@BS-PUB-UBUNTU-01:~$ echo TEST123 | awk '{print $0|"rev";print $0}'
TEST123
321TSET

ゴクゴクたま~にだが、ログインユーザに権限のないディレクトリ(rootの所有しているディレクトリとか)に対してscpを実行したい、といった事がある。

ただscpコマンドは基本的にそのような機能は有しておらず、リモート側でsudo経由でscpを実行してくれるような挙動はしてくれない。なので、大体こういった場合には(前にもここに書いたのだけど)一度tarで固めた後にsshにパイプで渡して、それをそのまま展開してしまう方法が一般的…というか楽だ。


今まで余り考えずクライアント側のコマンドをただ実行するだけで知らなかったのだが、scpには-t-fというオプションがあるらしい。 このオプション付きでサーバ側でscpを実行することで、標準入力から処理内容を受け付けてファイルを転送しているそうだ。

1. ローカルからリモートへ転送する場合

ローカルからリモートに転送する場合は、以下のように改行区切りで指示を出し、それをパイプでscpに渡す。 転送する対象となるファイルPATHやサイズを指定して、次にその中身を出力している。1ファイルにつき1回づつ転送することになるようで、配下のディレクトリを指定したら自動で作成されるようだ。

...

シェル芸で遊んでいた際、行頭と行末以外を置換したいといった事があったので、備忘として残しておく。 置換処理というとまっさきにsedの利用を思いつくのだが、残念ながらsedで行頭・行末の文字以外を指定する方法が思いつかず、Perlの先読み・後読み正規表現を使って置換することにした。

echo あいうえお | perl -C -pe 'use utf8;s/((?<!^).(?!$))/_/g'

よくbashでコマンドの一覧を取得する際に利用するcompgenだが、残念ながらzshではデフォルトで有効になっていない。 で、その状態でzshでPATH配下にあるコマンドの一覧を取得したいといった場合、どうすればいいだろう。

zshでは、以下のコマンドでPATH配下にあるコマンドの一覧が取得できる。

whence -pm "*" # フルパス表示
print -rl -- $commands # フルパス表示
print -rl -- ${(ko)commands} # コマンドのみ表示

ふと、特定の文字列同士を入れ替える(パターンに応じて文字列の置換をさせる)処理をワンライナーでさせるにはどうすればいいかなと思ったので、ちょっと調べてみた。

sedの場合

sedの場合、よく思いつくのが以下の様に一度別の文字列に置換してから処理をするやり方。

コマンド | sed 's/パターンA/\x0/g;s/ぱたーんB/パターンA/g;s/\x0/ぱたーんB/g'
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "「あいうえお」と「かきくけこ」\nそして、「かきくけこ」と「ABCDE」、「あいうえお」"
「あいうえお」と「かきくけこ」
そして、「...

Gitlab CI/CDを使って開発・本番環境へのデプロイを自動or手動(Gitlabの画面から)で行えるようにする

諸事情が有り、Gitlabにpushと同時に対象の環境へ自動的にデプロイをさせたり、手動でデプロイさせる際にGitlab上でボタンクリックで行わせたいということがあった。 で、Gitlab CI/CDを用いてブランチごとに各環境へのデプロイを行わせる事にした。Gitlab CI/CDでは実行する処理をそのままbashスクリプトで書けるので、デプロイの方法は一般的であろうgit clone(fetch)後にその内容をrsyncでssh越しに同期させる方式を取る。

今更説明せんでもいいかなと思うのだけど、Gitlab CI/CDを使ってデプロイをする際は以下の役割(機能)を持つノードが必要にな...