0

bash の man ページを参照すると、bash の履歴に関する次の文が表示されます。

複数行の複合コマンドの 2 行目以降はテストされず、 の値に関係なく履歴に追加されます HISTCONTROL

しかし、私はこれを試しました:

$ HISTCONTROL=ignorespace
$  if [ -f /var/log/messages ]
> then
> echo "/var/log/message exists."
> fi
$ history | tail -2
   18  HISTCONTROL=ignorespace
   19  history | tail -2

ifはスペースで始まることに注意してください。このif複合コマンドの 2 行目がまだ履歴に表示されないのはなぜですか?

4

1 に答える 1

2

複数行のコマンドは、シェルでは 1 行になります。

$  if [ -f /var/log/messages ]
> then
> echo "/var/log/message exists."
> fi

は次のように同じです:

if [ -f /var/log/messages ]; then echo "/var/log/message exists."; fi

したがって、1行のコマンドにスペースを入れると、履歴設定のように無視されます。

追加: シェル オプション cmdhist の効果

shopt -s cmdhist # set cmdhist (is set by default)
if [ -d /tmp ]
> then
> echo Hello
> fi
Hello
history 2
43  if [ -d /tmp ]; then echo Hello; fi
44  history 2

この場合、複数行のコマンドは単一行に連結されます。

shopt -u cmdhist # unset cmdhist
if [ -d /tmp ]
> then
> echo Hello
> fi
Hello
history 5
   46  if [ -d /tmp ]
   47  then
   48  echo Hello
   49  fi
   50  history 5

このような場合、履歴の各行が個別に表示されます。

ここで ignorespace オプションを設定すると、if[] の 4 行すべてで機能するはずです。したがって、(bash man の) 免責事項は、cmdhist=off で常に機能するかどうかわからないと言うでしょう。したがって、ignoreoption は 2 行目の "then" では確実に機能しません。「then」の前にスペースを入れても無視されません。最初の行でのみ機能しますが、次のすべての行で機能します。

最後の例(スペースで始まる2行目を無視しない)

if [ -d /tmp ]
>  then
> echo Hello
> fi
Hello
history 5
   66  if [ -d /tmp ]
   67   then
   68  echo Hello
   69  fi
   70  history 5


これがあなたの質問に答えてくれることを願っています。

于 2012-11-04T01:04:13.570 に答える