Home > Archives > 2015年11月

2015年11月

tsort

トポロジカルソートをしてくれるコマンド.エッジ達を与えればいい.エッジは hoge→fuga なら "hoge fuga" のように空白区切りで始点と終点を与える.1 行に 1 エッジ書いてくのが普通な気がするけれど,任意の空白で区切られたトークン列に対して「2n - 1 番目 → 2n 番目」というエッジが定義されるというルールなので,ぶっちゃけ一直線に書いてもいいっぽい.

$ echo "2 1 3 2 4 1 4 2 4 5 5 6 6 1" | tsort
3
4
5
2
6
1

ループ検出もしてくれる.

$ echo "2 1 3 2 4 1 4 2 4 5 5 6 6 1 1 3" | tsort
4
5
6
tsort: -: input contains a loop:
tsort: 1
tsort: 3
tsort: 2
1
3
2

ループ検出してもとりあえず答えを出すという優秀さ.

こんなコマンドがあるとか全然知らんかった.

外部コマンドを使わずに bash だけでテキストファイルをコピーしたい

 .bashrc に export LD_LIBRARY_PATH=~/opt/lib/ と書かれている環境で,glibc を configure --prefix=~/opt とやって make all install とかやってしまった.おかげで新しく実行するコマンドがインストール途中の glibc を見に行ってしまって「ライブラリロードできねーんだよボケ」と吐いて止まってしまう状況に陥った.つまりスタティックリンクされてないような普通の mv, cp, cat, ... なコマンド達が使えない.

この状況から抜け出すには .bashrc の LD_LIBRARY_PATH の設定を消してログインしなおせばいい.最も単純には echo > .bashrc とやってしまえば良いけれど,.bashrc のバックアップを取ってないのでこれをやる前にバックアップを取っておきたい.

ということで,bash の機能だけで .bashrc を .bashrc.bak にコピーするという必要が生じた(ということにした).1分位悩んだ後で思いついた解答:

while read line; do echo $line; done < ~/.bashrc > ~/.bashrc.bak

とりあえず思いついたのがこの回答だったのだけど,もっとスマートにコピーできないのだろうか?

閑話休題.

上記の状況でファイルをコピーする一番楽な方法は,LD_LIBRARY_PATH を空にすることである.

export LD_LIBRARY_PATH=""

これで状況を脱した.

もしくは状況を楽しんだままコピーだけしたいなら,コマンドを打つときにローカルで指定してもいい.

LD_LIBRARY_PATH="" cp .bashrc .bashrc.bak

なお,他のアカウントからどうにかするという手順は面倒なので却下.

Home > Archives > 2015年11月

Search
Feeds

Page Top