Зависящая от языка команда » да » в Linux возможна?

#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 было бы короче и, вероятно, быстрее. Но это также не решает проблему ОП.