[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Временная смена локали в shell-скрипте



On 2009.06.17 at 11:10:11 +0400, Andrey Zhidenkov wrote:

> Снова добрый день.
> 
> Возникли проблемы с кодировкой в sqlplus для linux, решил написать на shell скрипт,
> который бы делал следующее:
> 
> 1. Сохранял текущую локаль
Это лишнее. 

> 2. Менял локаль на CP1251
> 3. Запускал sqlplus
> 4. После завершения sqlplus восстанавливал бы значения для локали.
Это тоже лишнее. 

Локаль - это свойство процесса. Поэтому по завершении скрипта, когда мы вернемся
в исходный шелл, у него останется та же локаль, которая была.

Вообще, говоря, шелл имеет специальный синтаксис для установки
переменной окружения для одной команды.

ИМЯ_ПЕРЕМЕННОЙ=значение команда

Т.е. поставленная задача решается без всякого скрипта одной командой

LANG=ru_RU.CP1251 sqlplus

Правда, есть одно маленькое но - вероятно, хочется вместе с локалью
поменять и шрифт, которым отображается вывод SQL-plus, а также еще и то,
как эмулятор терминала интерпретирует вводимые с клавиатуры русские
буквы. Первое можно очень легко сделать, выдав соответствующую
esc-последовательность, со вторым посложнее - надо менять локаль
процесса эмулятора терминала.

Впрочем, если эмулятор терминала правильно настроен, он сам сообразит,
какие шрифты использовать, в зависимости от локали.

Поэтому можно запустить LANG=ru_RU.CP1251 xterm -e sqlplus - при этом
будет открыто новое окно xterm, в котором будет правильно
интерпретироваться ввод русских букв, и, при правильной настройке
русские буквы будут правильно отображаться, и внутри сразу запущен
sqlplus.

Но вообще-то если sqlplus это от Oracle, мне как-то странно, что он
плохо себя ведет с кодировками. Помнится, еще в oracle 8.0 он прекрасно
умел работать в любых локалях. Только ему нужно было установить помимо
LANG, еще и Oracle-специфичную переменную NLS_LANG, по структуре такую
же, но с названиями языков, регионов и кодировок принятых в oracle.

Что-то вроде NLS_LANG=RUSSIAN_CIS.CL8KOI8R  для кодировки KOI8-R
У меня в те времена был даже в ~/.profile написан case, который в
зависимости от текущего LANG выставлял правильные NLS_LANG и
PG_CLIENTENCODING. В utf-8 локали это тоже прекрасно работало, по крайне
мере в Oracle 8i.



> Допустим, как реализовать 2-3, я догадываюсь, но как осуществить пп. 1 и 4?
> 
> 
> -- 
> To UNSUBSCRIBE, email to debian-russian-REQUEST@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
> 


Reply to: