基本的に実装する方法これバッシュから?構文解析の出力にlocale
はdeclare "$(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_ALL
LC_CTYPE
locale
LC_ALL
LC_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)