![「if tty -s」は機能しますが、「if [tty -s]」は機能しないのはなぜですか?](https://linux33.com/image/155364/%E3%80%8Cif%20tty%20-s%E3%80%8D%E3%81%AF%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E3%80%8Cif%20%5Btty%20-s%5D%E3%80%8D%E3%81%AF%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%AA%E3%81%84%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F.png)
ちなみに私はksh
CentOSを使用して実行しています。
次のようにロガー機能が設定されたシェルスクリプトがあります。
if tty -s
then
echo "${FOO}" | tee -a ${BAR_LOG_FILE}
else
echo "${FOO}" >> ${BAR_LOG_FILE}
fi
if
私の問題は、コードの他のすべてのテストのように見えるようにリファクタリングすると実行が停止することです。if
なぜ?
私のリファクタリングは次のとおりです。
if [ tty -s ];
then
echo "${FOO}" | tee -a ${BAR_LOG_FILE}
else
echo "${FOO}" >> ${BAR_LOG_FILE}
fi
私が変更した唯一の変更は、残りのテストと同様に、周囲に括弧を入れて追加したことif
です。すべて期待どおりに動作します。;
if
リファクタリング結果がBAR_LOG_FILE
見つからないエラーが発生しました。
ここで何が起こっているのでしょうか?
答え1
次の角かっこif
はシェル構文ではなく、スタイル設定に応じて省略または省略できます。test
。 (リンクされたマンページは外部test
/[
コマンドを記述しますが、多くのシェルは独自の実装を提供します。)
書く
if [ tty -s ];
書き込みに対応
if test tty -s;
test
/には演算子[
がないため失敗しますtty
。
if
その後、それを実行するコマンドが続き、コマンドの終了コードは後でどのブランチを取得するかを決定しますif
。 0の場合はthen
そのブランチをインポートし、そうでない場合はそのelse
ブランチ(存在する場合)をインポートします。