CygwinでVimを起動すると Warning: Output is not to a terminalというエラーが出て操作不能になる話

 この間からCygwin上でviを使おうとすると以下のようなエラーがでて操作できなくなってしまう問題が発生した。状況としてはvi自体は起動するのだけど、入力モードに固定されているっぽく、終了などを含む操作ができなくなってしまう。

$ vim
Vim: Warning: Output is not to a terminal
Vim: Warning: Input is not from a terminal

 以前は、うまく動いていた気がするし、特に設定を触った記憶もないのだけど、いつの間にか同じ症状が出てしまう。過去にも同じ問題が出てしまったときは、原因がよくわからなかったのでCygwin自体の再インストールで乗り切った。

 で、しばらく調子が良かったのだけど、再発。仕方ないのでもう少し調べてみる。と言ってもなんとなく以下でわかった感じ。

$ which vi
/usr/bin/vi
$ which vim
/cygdrive/c/Program Files/Git/usr/bin/vim
$ alias vi
alias vi='vim'

 要するに、viがvimにエイリアスされていて、vimがCygwin外のvimを使われていてと言う感じで変なことになっていたらしい。この辺いじった記憶はないのだけど、何かをインストールしたときにでも変わったのかも。

 そもそもCygwinのviはvimなので謎のaliasが不要。削除したらうまく動くようになった。
わかってみるとたいしたことないな。

locate などの出力に対して xargs -0 を使う

Linux系のよく使うパターンに以下のようなものがある。要するに find で引っ掛けたファイルに対して grep をかけるというもの。

$ find ./hogehoge -type f -print0 | xargs -0 grep "foobar"

普通にパイプで渡すとファイル名に空白文字などが含まれていると上手く grep でひかっけられない。ので、-print0 と -0 を重ねることでファイル名の区切りを空白文字からヌル文字(\0)に置き換えている。

普通に find を使う分には -print0 のオプションが使えるので便利なんだけど、既にファイルの一覧ができてしまっている場合や locate でファイルを引っ掛けた場合に使えなくてゲンナリする。で、その対応。

とは言っても別に特別なことをするわけじゃなく、tr コマンドで改行をヌル文字(\0)に変えればいいんじゃないのってだけの話。

$ find ./hogehoge -type f > sample.lst
$ cat sample.lst | tr "\n" "\0" | xargs -0 grep "foobar"

locateから直接パイプで流し込むなら以下の様な感じ

$ locate "/hogehoge" | tr "\n" "\0" | xargs -0 grep "foobar"

Linuxでユーザ名を変更する

うっかり作ってしまったユーザ名を変更する

ユーザ名とホームディレクトリを変更する
$ usermod -l new_user -d /home/new_home -m old_user

新しいグループを作成する
$ addgroup new_group

ユーザグループを変更する
$ usermod -g new_group -G new_group new_user

ディレクトリのグループを一括で変更する
$ chgrp -R new_group /home/new_home

古いグループを削除する
$ groupdel old_group

Solarisのtarを使う時に特定のディレクトリを除外する

GNU tarであれば、--excludeで指定すればいいんだけど、Solarisではできないので調べてみた。

以下のサイトを参考に
tarで特定のファイル/ディレクトリを除外

grepと併用する

バックアップしたいディレクトリ
: hoge

除外したいファイル名・ディレクトリ名
: bar

バックアップのファイル名
: buzz.tar.gz

$ tar cvf – find hoge -type f -print | egrep -v 'bar' | gzip -c > buzz.tar.gz

BOMが付いてしまったテキストをFindとGrepで探す

findの結果をfileコマンドに送って、その結果をgrepしている

$ find ./ -type f -exec file {} \; | grep “with BOM”

単体でfileすると以下の様に「(with BOM)」と結果が返ってくるので、それをgrepで引っ掛ける。ので、手癖でxargs grepとか書くとおかしな話になるので注意

$ file ./contents/readme.md

./contents/readme.md: UTF-8 Unicode (with BOM) text