複数サーバーを管理していると、ターミナルコマンドでの作業が増えてきます。
似たようなサーバーでそれぞれの端末にログインして作業をするのが億劫になったので、鍵作って、sshコマンドで、全てのサーバー端末にログインして特定のコマンドを実行して値を得るようにすれば、非常に作業効率化になると考え、shellプログラムでの一括処理を行って見ました。
その際に、対象サーバーがDebian系とCentOS系の2種類あり、Debian系もUbuntuがあったりして、いわゆるマルチディストリ状態です。
何故かディストリ毎に違うエスケープ処理の解釈違い
ここでshell内部でechoした時に、表示する文字列に改行コードが含まれていたのですが、(\n←こういうやつ)Debian系では、改行解釈されて表示される一方、CentOS系では、エスケープされずに"\n"と表示されてしまうではありませんか・・・
簡単な状態でプログラムを紹介すると、以下のような感じです。
#!/bin/bash
echo "hoge\nhage"
## 結果表示
## Debian系
hoge
hage
## CentOS系
hoge\nhage
これ自体さほど問題ではなく、ちゃんとエスケープ解釈をする"-e"オプションをつければいいだけのこと・・・
#!/bin/bash
echo -e "hoge\nhage"
## 結果表示
## Debian系
-e hoge
hage
## CentOS系
hoge
hage
ガーーーーーン!!!
なんという事でしょう!!!
今度はCentOSでは正常に表示されたのに、Debianでは、"-e"オプションが文字列として表示されてしまいました。
原因調査
これに対して、30分ほど全く何が起きているのか理解できなかったのですが、echoコマンドも所詮はプログラムモジュール。
バージョンや、実行しているプログラムが違うのではないかと考えた。
それぞれのOSで"$ which echo"と実行してみても、"/bin/echo"という同じ返答があり、どの環境でも同じモジュールを見ている事はわかったが、何となく釈然としない。
これまで気にしていなかったが、CentOSは、コマンドラインが英語表記になっているが、Debian系は日本語表記になっているので、こうした環境自体の問題なのではないかと考えたが、すでに本番稼働しているそれぞれのサーバーのこうした環境設定を変更するのはあまり好ましくない。
力技で解決
そして悩む事数時間・・・
以下のようにプログラミングすることで、同一の結果が得られるようになりました。
#!/bin/bash
/bin/echo -e "hoge\nhage"
## 結果表示
## Debian系
hoge
hage
## CentOS系
hoge
hage
どちらも同じプログラムを実行しているはずなんですが、/bin/echoを直接使う事で、同じ結果が得られるようになりました。
システムに入り込んでいるプログラムはまだまだ謎な現象がありそうです。
ひとまず、shell内で標準環境コマンドを使う場合は、フルパスでの記述が不具合回避になるという事を覚えてしまいました。
0 件のコメント:
コメントを投稿