ssh(または他のssh様クライアント)を介してアクセスしている他のコンピュータのbashスクリプトで奇妙なエラーが発生しました。
デフォルトでは、ホストされているコンピュータのIPアドレスを具体的に表示するメニューです。
重要な部分は次のコードです。
#!/bin/bash
function int-ips { /sbin/ifconfig |grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }'; }
echo $(int-ips)
(私は上記の関数をコピーして貼り付けました。http://www.if-not-true-then-false.com/2010/linux-get-ip-address/)
Mac OS XのF19では見事に動作します。その後、他の同僚が自分のOS Xでこれを試しましたが、驚くべきことに何も印刷されませんでした。スクリプトはまだ同じマシン上で実行されており、他のクライアントからSSHを介してアクセスされます。
これがロケールの問題であることを理解するのに時間がかかりました。最後のコンピュータの言語は英語ではなく、IPアドレスを取得するために使用された関数は「grep Link」を使用し、「link」という単語は偶然にifconfigに翻訳されました。少なくとも私の同僚が使用している他のロケールと一緒に使用してください。
ひどいエラーソースがあることに気づき、このロケール依存関係の問題から自分を適切に保護する方法を知りたかったです。
たとえば、入力のファイル形式を調べるには "file"コマンドを使用し、結果を分析するために "grep"などを使用することを知っています。
私の解決策:
私のスクリプトの先頭に以下を追加します。
export LANG=C
export LC_ALL=C
(またはCの代わりにen_US.utf8かもしれません)
後で行うことができるよりクリーンなソリューションは次のとおりです。
- 現在のLANGとLC_ALLを保存
- エクスポートLANG = C;エクスポートLC_ALL = C
- 私のロケール関連コードの実行
- 1) に保存されたユーザーロケールの復元
私の質問:
A)この修正は可能ですか?私は、私が見ていないこのアプローチを使用するときに発生する可能性があるいくつかのリスクについて警告することができる経験豊富なbash / nixコーダーはありますか? (nix / nuxを深く掘り下げるほど、私はより確実になります。何もない:血)
B)これらすべてを行うためのよりクリーンでエレガントな方法はありますか?
PSメモですが関係ありません。 IMHO:
スクリプトをホストするマシンは、Centos 6.4がインストールされている仮想マシンにあります。
VMにアクセスするシステムは、Fedora 19、Mac OS X(ssh端末経由)またはWindows 7(Putty経由)にあります。
答え1
コマンドの直前に環境変数を追加すると、コマンドの期間だけがかかるため、最終アプリケーションに適している場合と適していない場合があります。
LC_MESSAGES=C /sbin/ifconfig | grep ...