整数以外の時間オプションでwatchコマンドを呼び出すことはできません。

整数以外の時間オプションでwatchコマンドを呼び出すことはできません。

可能な限り短い時間間隔は、0.1で定期的にwコマンドを実行したいと思います。man watch

私は試した:

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

watchn オプションを整数以外の値として使用してコマンドを開始しようとすると、エラーが発生します。

watch: failed to parse argument: '0.1'

答え1

これはロケールの問題です。パラメータをロケール依存に変換するには、ロケール依存をwatch使用します。strtod(3)-ndouble

-nこの問題を解決するには、さまざまな区切り文字を使用してパラメータを指定する必要があります。

watch -n 0,1 w

または、ピリオド文字を小数点として使用するロケールに変更します。

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


いくつかの参考資料:

  1. Linuxのマンページの関連セクションstrtod

10進数は空でない10進数のシーケンスで構成され、基数文字(ロケールに応じて小数点、通常「.」)を含めることができます。

  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"
    ...
    
  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リンクを更新しました

答え2

ただのサプリメントZackの素晴らしい答え

2つの質問があります。

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

回避策として、watch数値形式をユーザーの規則に従って指定し、英語形式で指定しようとします。

  1. LC_ALL設定しても効果はありません。回避策は以下LC_ALLLC_NUMERIC使用することです。

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

    しかし、これは以下の2番目のポイントをさらに悪化させるでしょう

  2. watch(この場合w)によって開始されたコマンドはこのコマンドを継承しますLC_NUMERIC。そのため、ユーザーが期待する形式で数値が出力されず、米国英語形式で出力されます。

w理想的には、コマンドの動作に影響を与えずに(ユーザーのロケールに関係なく)10分の1秒ごとにクロックを実行するように指示したいと思いますw(常にユーザーが自分のロケールで理解できる出力を提供する必要があります)。

yashシェルを使用すると、次のことができます。

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

yash浮動小数点演算をサポートする 3 つの Bourne 型シェルのうちの 1 つ (残りzshksh93)。しかし、国際化を正しく行う唯一の製品です。zsh常に.小数点として使用され、ksh93内部構文のロケールイベントの小数点に従います。

の場合yash.算術構文の小数点ですが、入力/出力ではロケールの小数点に従います。

ここで使用できるもう1つの秘密は、科学的表記法を使用して小数点全体を入力しないことです。

watch -n 1e-1 w

または、ロケールで小数点を照会することもできます。

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

答え3

2つのコマンドは、最初の文字が同じであることを除いて、watch互いに関係がありませんw。パラメータがw等しく有効であると仮定することはできませんwatch。このwatchコマンドは整数秒を値として使用します-n

ところで、私も見たマニュアルページw期間の言及は見えません。 (希望的に)より詳細に説明するために、この情報をどこで入手したかを知りたいです。

修正する

watch実際にはタイマーではなく、タイマーを意味しているようですw。この新しい公開内容に合わせてご質問を更新いたします。最後にこれを見つけ、私はそれに問題がないと思いますwatch -n 0.1 w

関連情報