BashでLC_CTYPEなどの現在の値を取得するには?

BashでLC_CTYPEなどの現在の値を取得するには?

基本的に実装する方法これバッシュから?構文解析の出力にlocaledeclare "$(locale | grep ^LC_CTYPE | tr --delete '"')"4つの個別のコマンドが含まれているため、悪いようです。localeほとんどまたはすべての変数の値が印刷されても、その変数が実際に設定されているわけではありません。たとえば、私のコンピュータでは(別の行で)locale印刷されますが、何も印刷されません。LC_CTYPE="en_NZ.UTF-8"echo "$LC_CTYPE"

答え1

評価結果が安全であると仮定します(シェル関数、エイリアス、または他の非標準ユーティリティはlocale想定しません)。locale

(eval "$(locale)" && printf '%s\n' "$LC_CTYPE")

これはLC_サブシェル環境ですべての関連変数を設定し、その値を印刷しますLC_CTYPE。サブシェル内で実行すると、eval変数が親環境を汚染するのを防ぎますLC_

OpenBSDシステムで実行されている例では、次のように設定しましたLANG=C.UTF-8

$ (eval "$(locale)" && printf '%s\n' "$LC_CTYPE")
C.UTF-8

レポートに設定されていない値LC_CTYPEで変数を設定(およびエクスポート)する場合localeその他可変的な:

$ export LC_CTYPE="$(eval "$(locale)" && printf '%s\n' "$LC_CTYPE")"
$ printf '%s\n' "$LC_CTYPE"
C.UTF-8

答え2

男の言葉によるとlocale値を二重引用符で囲むと、LC_CTYPEその値が「暗黙の値」であることを示します。

環境に設定された変数値は
二重引用符なしで出力され、暗黙的な値は二重引用符で出力されます。

これは、「暗黙の」値がLC_CTYPE設定されずに印刷されることを意味します。locale正しく理解したらはの値になりLC_ALL、設定されていない場合は次の値になりますLANG

glibc の場合は、クラスに関係なく環境変数 LC_ALL を最初に確認し、次にクラスと同じ名前の環境変数を確認し、最後に LANG 環境変数を確認します。最初の既存の環境変数の使用

したがって、locale見つかった最初の値が次の順序で使用されます。LC_ALL設定すると優先順位が適用されるため、for値も設定されていLC_CTYPEても(別のロケールで)LANG 報告されます。LC_ALLLC_CTYPElocaleLC_ALLLC_CTYPE

とにかく、LC_CTYPE現在使用中の値を取得するには、locale次のように実行できます。

echo ${LC_ALL:-${LC_CTYPE:-$LANG}}

最初は、ifの実際の値を取得し、設定されていない場合LC_CTYPEにのみ使用された値に戻ることが目標だと思いました。この場合、最初の2つの変数を置き換える必要があります。locale

echo ${LC_CTYPE:-${LC_ALL:-$LANG}}

答え3

出力を解析localeして変数を設定したい場合は、次のように直接インポートできます。

. <(locale | grep '^LC_CTYPE=')

次のLC_TYPE行のみを選択してください。

$ locale | grep '^LC_CTYPE='
LC_CTYPE="en_US.UTF-8"

次に、.組み込みコマンドを使用して現在のシェルにインポートします。

$ echo $LC_CTYPE 

$ . <(locale | grep '^LC_CTYPE=')
$ echo "$LC_CTYPE"
en_US.UTF-8

これにはサポートされているシェルが必要です。プロセスの交換bashまたはまたはzshその他kshなど。そのようなシェルを使用しない場合は、次のようにもっと複雑な作業を行う必要があるかもしれません。

locale | grep '^LC_CTYPE=' > file && . ./file

答え4

以下を除く外部コマンドは使用しませんlocale

while read -r line; do
    [[ "${line}" =~ ^LC_CTYPE= ]] && {
        export LC_CTYPE="${line#*=}"
        break
    }
done < <(locale)

関連情報