Intereting Posts
как сделать переменную PKG_CONFIG_PATH ссылкой на установленную библиотеку? Как открыть файл в последней закрытой позиции в VI Как найти скрытый раздел USB в Linux запустить демон при запуске / логине, если запланированное время пропущено Инструмент lshw и возвращаемые параметры и их значения Как запустить команду со скрытым паролем Что такое `& gt; &` в простых терминах? Введение в shell-скрипты с базовым приложением: как настроить мой компьютер на создание архива определенной папки каждый день? Получить последний каталог (не последний файл) rsync создает каталоги с тем же именем внутри папки назначения Как Linux обновляет пакеты, которые используются? Создание переменной с sed в ksh Как я могу постоянно сообщать OpenSUSE об обновлении часового / текущего времени? как установить размер блока с помощью команды blockdev tar выходит на «Can not stat: Нет такого файла каталога», почему?

Невозможно вызвать команду watch с нецелым параметром времени

Я хочу периодически запускать команду w , по мнению man watch наименьший возможный интервал времени равен 0,1.

Я пытался:

 watch -n1 w (works) watch -n1.5 w (does not work) watch -n0.1 w (does not work) 

Когда я пытаюсь запустить команду watch с n-опцией как нецелое число, я получаю сообщение об ошибке:

 watch: failed to parse argument: '0.1' 

Это проблема локали. watch использует strtod(3) , который зависит от языка, для преобразования аргумента в -n в double .

Чтобы устранить проблему, вам нужно либо указать аргумент -n с другим разделителем:

 watch -n 0,1 w 

Или измените свой язык на параметр, в котором используется символ периода для десятичной точки:

 export LC_NUMERIC=en_US.UTF-8 watch -n 0.1 w 

Несколько ссылок:

  1. Соответствующая часть файловой strtod Linux для strtod :

Десятичное число состоит из непустой последовательности десятичных цифр, которые могут содержать знак радиуса (десятичная точка, зависящая от локали, обычно '.').

  1. Вы можете просмотреть текущие настройки, запустив locale в своем терминале:

     locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" ... действия locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" ... 
  2. Исходный код, о котором идет речь, может быть рассмотрен в gitlab:

    https://gitlab.com/procps-ng/procps/blob/85fff468fa263cdd2ff1c0144579527c32333695/watch.c#L625

    https://gitlab.com/procps-ng/procps/blob/85fff468fa263cdd2ff1c0144579527c32333695/lib/strutils.c#L49

(редактировать 2017-09-07): обновленные ссылки gitlab

Просто дополнение к прекрасному ответу zackse .

Есть две проблемы:

 LC_NUMERIC=en_US.UTF-8 watch -n 0.1 w 

как работа вокруг того, что watch ожидают цифры, отформатированные в пользовательской конвенции, пока вы ожидаете, что они будут в английском формате.

  1. Это не работает, если установлен LC_ALL . LC_ALL переопределяет все другие настройки языка, включая LC_NUMERIC . Работа будет заключаться в использовании:

     LC_ALL=en_US.UTF-8 watch -n 0.1 w 

    но тогда это сделало бы второй пункт ниже еще хуже

  2. команда, запускаемая watch (в этом случае w ), наследует этот LC_NUMERIC . Поэтому вместо того, чтобы выводить свои номера в формате, ожидаемом пользователем, он выводит его в формате США по-английски.

В идеале здесь мы хотим сказать, что часы запускаются каждую десятую часть секунды (независимо от локали пользователя), не влияя на поведение команды w (которая всегда должна давать пользователю понятный пользователь в его собственной локали).

С помощью оболочки yash вы можете сделать это с помощью:

  watch -n "$((0.1))" w 

yash – одна из трех оболочек, похожих на Bourne, которые поддерживают арифметику с плавающей запятой (другие – zsh и ksh93 ). Тем не менее, это единственная, которая делает интернационализацию. zsh всегда использует . как десятичная метка, а ksh93 чтит один из события локали во внутреннем синтаксисе.

Для yash является десятичной меткой для его арифметического синтаксиса, но он отличает локальный язык от ввода / вывода.

Другой трюк, который вы можете использовать здесь, заключается в том, чтобы избежать ввода десятичной метки вообще с помощью научной нотации:

 watch -n 1e-1 w 

Или вы можете запросить десятичную метку из локали:

 m=$(locale decimal_point) watch -n "0${m}1" w 

Команды watch и не имеют ничего общего друг с другом, кроме первой буквы, равной. Вы не можете предположить, что параметр для w одинаково важен для watch . Команда watch принимает целое число секунд в качестве значения для -n .

Кстати, я также посмотрел на страницу man для w и я не вижу никакой ссылки на период времени. Мне любопытно узнать, откуда вы получили эту информацию, чтобы я мог (надеюсь) объяснить дальше.

ОБНОВИТЬ

Похоже, вы на самом деле ссылаетесь на таймер для watch , а не на w . Я обновлю свой вопрос, чтобы соответствовать этому новому раскрытию. Наконец, обнаружив это, я не вижу ничего плохого в watch -n 0.1 w .