Posts Tagged ‘Unix’

tux

#!/usr/bin/perl
#!/usr/bin/python

などなど、Linuxサーバー上でスクリプトファイルを作成する際、文頭につけるおまじないの様な"#!" ですが、
これには"#"でコメントアウト "!"で次のプログラムで実行の意味を持っています。

つまり、スクリプトファイルの種類はperlやpython等に限定されず、対話型のプログラムであれば何にせよ
スクリプトファイルを作って実行出来るという事になります。

例えばLinuxのほとんどのサーバーに入っているcd(逆ポーランド記法計算プログラム)のスクリプトも
この形式に則れば書けるという事です。

■ 単体で実行する場合

dctestというファイルを作成して、中に以下のコードを書いてみます。

#!/usr/bin/dc
2 3 +
5 *
p

逆ポーランド記法においては 2 3 + = 2 + 3
5 * で前行の解に5を掛けています。dcはすべての式を入力し終わった後にpを入力すると演算結果を吐き出します。
つまりこの場合 (2 + 3) * 5 の結果 25 を標準出力(ディスプレイ)に出力するはずです。

実行権限を与えてやってから./dctestを実行しましょう。
ディスプレイに25が表示されているはずです。これは !/usr/bin/dc が機能した形ですね。

■ 他のバイナリの引数として与える場合

続いて以下を実行してみましょう

$cat ./dctest | dc

周知のとおりcatはファイルの中身を標準出力に吐き出すコマンドですが、cat ./dctest まで実行すると
この時点では#!/usr/bin/dcの部分まで出力されているのがわかります。
これをパイプを通してdcに渡すと、dcは#をコメントとみなし、その行を処理しません。
したがってファイルの計算部分だけを実行する事で25という正しい解を返す事ができます。
もしコメント部分を無視しない仕様であるなら、dcのプロセスを2重起動する事になりますので。

という事で"#!"の深いようなそうでないような話でした。
unix系システムの一貫性とシンプル性を少しわかっていただけたかと思います。

684px-GNU_Screen

SSHを使ったUnix系シェルの操作時に、GNU-Screenを使ってターミナルの拡張をしている人は多いと思う。
Screenを使い始めの頃、シェルのログイン時にscreen -rdで以前のセッションを引っ張って来る方法を採っていた。
しかし、この方法だとセッションが存在しない場合に生成されない。

当時、screenがない場合は新しいセッション作って、既に在る場合はscreen -rdしたいなと思って、
大げさにもシェルスクリプトを組んだのはアホな思い出・・・。
そして結局その必要はなく、.profile(システムログイン時に実行されるバッチ処理)に

screen -d -RR

と書くだけで事足りてしまった。

これによって私のLinuxライフが格段に快適になった事は言うまでもない。
会社でサーバーにログインして作業して、家に帰ってサーバーにログインすれば作業中の内容をすぐに復元できる。
普段何気なく使っているが、これって実はとても凄い事だと思う。

man引用

-d -RR セッションを再アタッチする。必要ならばまずデタッチするか、
あるいはセッションを生成する。 複数のセッションをアタッチ可能な場合は、最初のセッションを使う。

車輪の再開発って奴でしたネ。