質問: Ubuntu 20.04LTSのターミナルにおいて、CPUの動作周波数を監視する下記のコマンドを入力すると全て同じ結果が出ますが、
回答: ┏━━━━━━━━━━━━━━━ watch [options] command ┗━━━━━━━━━━━━━━━ は command に渡された文字列を定期的に sh に渡して実行します。 watch の中では受け取った command を以下とほぼ同等の処理に渡していると考えてもらうと良いでしょう。 ┏━━━━━━━━━━━━━━━ while true; do clear; sh -c command; sleep 1; done ┗━━━━━━━━━━━━━━━ まず、ダブルクォーテーションを \ でエスケースせねばならない理由について考えましょう。 watch を ┏━━━━━━━━━━━━━━━ watch grep \"cpu MHz\" /proc/cpuinfo ┗━━━━━━━━━━━━━━━ のように呼ぶと watch 内部では $1="grep" $2="\"cpu MHz\"" $3="/proc/cpuinfo" がコマンドライン引数として得られます。 これはいかのようにして実行されます。 ┏━━━━━━━━━━━━━━━ while true; do clear; sh -c "grep \"cpu MHz\" /proc/cpuinfo"; sleep 1; done ┗━━━━━━━━━━━━━━━ つまり ┏━━━━━━━━━━━━━━━ grep "cpu MHz" /proc/cpuinfo ┗━━━━━━━━━━━━━━━ を繰り返します。 ところが ┏━━━━━━━━━━━━━━━ watch grep "cpu MHz" /proc/cpuinfo ┗━━━━━━━━━━━━━━━ のようにしてしまうと $1="grep" $2="cpu MHz" $3="/proc/cpuinfo" となってしまうため ┏━━━━━━━━━━━━━━━ while true; do clear; sh -c "grep cpu MHz /proc/cpuinfo"; sleep 1; done ┗━━━━━━━━━━━━━━━ のような処理になってしまいます。 つまり、 ┏━━━━━━━━━━━━━━━ grep cpu MHz /proc/cpuinfo ┗━━━━━━━━━━━━━━━ という処理を繰り返すことになるので目的を果たしません。 いちいちエスケープするのは面倒なので、以下のように繰り返すべきコマンド全体をシングルクオートで囲むのが楽だと思います。 ┏━━━━━━━━━━━━━━━ watch 'grep "cpu MHz" /proc/cpuinfo' watch 'cat /proc/cpuinfo | grep "cpu MHz"' ┗━━━━━━━━━━━━━━━ 次に、cat を使う場合と使わない場合ですが、 ┏━━━━━━━━━━━━━━━ grep "cpu MHz" /proc/cpuinfo ┗━━━━━━━━━━━━━━━ と ┏━━━━━━━━━━━━━━━ cat /proc/cpuinfo | grep "cpu MHz" ┗━━━━━━━━━━━━━━━ は grep に自分で /proc/cpuinfo を開かせるか、cat から pipeline でもらってこさせるかの違いでしかありません。 ただし、 "|" は pipeline を意味しますからダブルクオーテーションの外に書くとそこでコマンドが切れて、結果を次のコマンドに pipeline されてしまいます。つまり cat を使っている場合にコマンド全体をダブルクオーテーションで囲んでいるのは、コマンド中で pipeline が使われているからです。 例えば、 ┏━━━━━━━━━━━━━━━ watch cat /proc/cpuinfo | grep "cpu MHz" ┗━━━━━━━━━━━━━━━ とすると ┏━━━━━━━━━━━━━━━ watch cat /proc/cpuinfo ┗━━━━━━━━━━━━━━━ の結果を grep することになります。 これは一見出来そうに見えますが、watch はフルスクリーン制御しているため出力先が標準出力ではないようです。このため watch の出力結果は grep に処理されず、画面には何も表示されないという結果になるでしょう。 最後に "^[c]pu MHz" は正規表現です。 ^ は行頭にマッチするという意味 [...] は ... に書かれた任意の1文字にマッチするという意味 になります。 /proc/cpuinfo は行頭以外の場所に "cpu MHz" は出現しませんし [c] は c と同義なので、今回の場合ほぼ意味のない書き方です。 どこからの引用かは知りませんが、多分書いてる本人も理解して書いてないことが疑われます。