#bash #ubuntu #locale
Вопрос:
Таким образом, команда » да «по умолчанию возвращает «y». Он идеально работал с английским языком в качестве системного языка в Ubuntu. Теперь у меня действительно есть пользователь, который пытается запустить программное обеспечение под Ubuntu с немецким системным языком, и оно работает не так, как ожидалось. Кажется, что в подсказках ожидается » j » или «ja», но » да «по-прежнему означает «y».
Есть ли способ сделать вывод » да » зависимым от языка? На данный момент мы начали использовать LC_ALL=C в верхней части скрипта. Но все равно оцениваю, является ли это хорошим решением.
Комментарии:
1. Что говорит против использования
yes j
в немецком контексте?2. Я не думаю, что знание или настройка локали обязательно говорит вам, какие входные данные будет ожидать команда.
3. Примечание:
yes
используется в сценариях, и сценарии должны использовать «C» (не английский) в качестве языка по умолчанию (стандартизированный вывод). У вас есть верный аргумент в пользу локализацииyes
, если бы другой ответ был лучшим решением? Или это просто теоретический вопрос?4. Есть
yes | LC_ALL=C some_command
ли вариант? Остальная часть сценария может использовать предпочтительный язык пользователя; только эта команда будет использовать язык C, соответствующий выходу по умолчаниюyes
.5. (Еще лучше, поддерживает ли ваша команда опцию, которая отключает необходимость чтения
y
илиj
стандартного ввода?)
Ответ №1:
Хорошо, откопал эту страницу: https://github.com/coreutils/coreutils/blob/master/src/yes.c
и на линии 63:
setlocale (LC_ALL, "");
""
означает следовать в setlocale
:
Если языковой стандарт представляет собой пустую строку»», каждая часть языкового стандарта, которая должна быть изменена, устанавливается в соответствии с переменными среды. Детали зависят от реализации. Для glibc сначала (независимо от категории) проверяется переменная среды LC_ALL, затем переменная среды с тем же именем, что и категория (см. Таблицу выше), и, наконец, переменная среды LANG. Используется первая существующая переменная среды. Если его значение не соответствует допустимой спецификации языкового стандарта, языковой стандарт остается неизменным, и setlocale() возвращает значение NULL.
Таким образом, он должен получить ваш системный язык, но это не так. (возможно, это может быть ошибка)
Ваша лучшая альтернатива — псевдоним.
Комментарии:
1. Но взглянув на несколько строк ниже, вы увидите, что строка
"y"
жестко закодирована по умолчанию, когда другие значения не были указаны. Иgettext
в этой строке не выполняется никаких вызовов, поэтому я бы сказал, чтоyes
это не интернационализировано. И даже если бы это было сделано GNU, это не помогло бы человеку, использующему утилиты BSD.2. @andlrc tnx, так что мой ответ должен быть таким, как должно быть, но это не так.
3. Эй. Спасибо за ваше исследование. Было хорошей идеей заглянуть непосредственно в код, чтобы все стало ясно.
Ответ №2:
Когда вы используете поддержку разных языков, у вас , вероятно, есть функция, которая обрабатывает ввод.
Измените эту функцию, чтобы она также принимала 0
для yes
и 1
для no
( true
возвращает 0).
Как только ваше программное обеспечение также примет 0 и 1, вы можете использовать
yes 0
Ответ №3:
Пожалуйста, попробуйте это:
yes | sed 's/y/ja/'
Более сложные:
myes(){
case ${LANG,,} in
*en*) yes=yes;;
*ru*) yes=да;;
*gr*) yes=ja;;
#...
esac
yes | sed "s/y/$yes/"
}
Похоже, sed не нужен, просто yes $yes
myes(){
case ${LANG,,} in
*en*) yes=yes;;
*ru*) yes=да;;
*gr*) yes=ja;;
#...
esac
yes "$yes"
}
Комментарии:
1.
yes ja
было бы короче и, вероятно, быстрее. Но это также не решает проблему ОП.