Impossible d'évoquer la command de surveillance avec l'option de time non entier

Je veux commencer la command w périodiquement, selon l' man watch le plus petit intervalle de time possible est de 0,1.

J'ai essayé:

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

Lorsque j'essaie de démarrer la command watch avec l'option n comme non-entier, j'obtiens le message d'erreur:

 watch: failed to parse argument: '0.1' 

    C'est un problème de locale. watch utilise strtod(3) , qui dépend de la locale, pour convertir l'argument en -n en un double .

    Pour résoudre le problème, vous devez spécifier l'argument -n avec un séparateur différent:

     watch -n 0,1 w 

    Ou changez vos parameters régionaux en un paramètre où le caractère de période est utilisé pour la virgule décimale:

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

    Quelques references:

    1. Une partie pertinente de la page de strtod Linux pour strtod :

    Un nombre décimal est constitué d'une séquence non vide de numbers décimaux contenant éventuellement un caractère de base (point décimal, dépend de la locale, généralement '.')

    1. Vous pouvez consulter vos parameters actuels en exécutant les locale dans votre terminal:

       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. Le code source en question peut être consulté sur gitlab:

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

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

    (éditer 2017-09-07): mise à jour des liens de gitlab

    Juste un complément à la bonne réponse de zackse .

    Il y a deux problèmes avec:

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

    comme un travail autour du fait que watch attendre les numéros formatés dans la convention de l'user pendant que vous attendez qu'il soit au format anglais.

    1. Cela ne fonctionne pas si LC_ALL est défini. LC_ALL remplace tous les autres parameters régionaux, y compris LC_NUMERIC . Le travail autour serait d'utiliser:

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

      mais alors cela rendrait le deuxième point plus bas encore pire

    2. la command démarrée par watch (dans ce cas w ) hérite de LC_NUMERIC . Ainsi, au lieu de sortir ses numéros dans un format attendu par l'user, il sera affiché au format anglais américain.

    Idéalement, ici, nous voudrions dire que watch va exécuter w tous les dixièmes de seconde (indépendamment des parameters régionaux de l'user) sans affecter le comportement de la command w (qui devrait toujours donner une sortie compréhensible par l'user dans sa propre locale).

    Avec le shell yash , vous pouvez le faire avec:

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

    yash est l'une des 3 shells Bourne qui supportent les arithmétiques à floating point (les autres étant zsh et ksh93 ). C'est le seul qui fait l'internationalisation correctement cependant. zsh utilise toujours . comme marque décimale, et ksh93 honore celui de l'événement locale dans sa syntaxe interne.

    Pour yash est la marque décimale pour sa syntaxe arithmétique, mais elle honore celle de la locale en input / sortie.

    Une autre astuce que vous pouvez utiliser ici est d'éviter d'entrer la marque décimale en utilisant la notation scientifique:

     watch -n 1e-1 w 

    Ou vous pouvez interroger la marque décimale à partir des parameters régionaux:

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

    Les commands watch et nous n'avons rien à voir l'une avec l'autre sauf que la première lettre est égale. Vous ne pouvez pas supposer qu'un paramètre pour w est également valable pour la watch . La command de watch prend un integer de secondes comme valeur pour -n .

    Par ailleurs, j'ai aussi regardé la page de manuel de w et je ne vois pas de reference à une période de time. Je suis curieux de savoir d'où vous avez obtenu cette information afin que je puisse (je l'espère) expliquer plus loin.

    METTRE À JOUR

    Il semble que vous faites reference à la timer pour la watch , pas pour w . Je vais mettre à jour votre question pour correspondre à cette nouvelle divulgation. Ayant finalement découvert cela, je ne vois rien de mal à watch -n 0.1 w .