3 ポイント 投稿者 GN⁺ 2023-11-24 | 1件のコメント | WhatsAppで共有

Unixシステムの興味深いバイナリファイル

  • Unixシステムには、名前が単一の記号であるバイナリファイルが存在する。
  • /bin/[ コマンドを実行すると、[ という名前のプログラムを確認できる。
  • [test は同じバイナリファイルを指しており、2つのコマンドは実際には同一の機能を実行する。

test プログラムと [ の使い方

  • test プログラムは、シェルで式を評価するために使われる。
  • 文字列比較、数値比較、ファイル条件の確認などに使われる。
  • test は引数を受け取って式を評価し、真なら 0、偽なら 1 を返す。

2つのコマンドが存在する理由

  • test[ の2つのコマンドが存在する理由は明確ではないが、可読性を高めるためだと推測される。
  • [ コマンドを使うと、test よりもすっきりと条件文を表現できる。
  • [ を使うときは、コマンドの最後の引数を ] で終えなければならない。

組み込みコマンドと外部バイナリファイルの違い

  • test[ はシェルスクリプトで頻繁に使われるため、ほとんどのシェルで組み込みコマンドとして実装されている。
  • 組み込みコマンドと外部バイナリファイルを使う場合では動作が異なることがあり、シェルによっても差が生じることがある。

[[ の使い方と違い

  • [[ は Bash 拡張であり、[ の使用を置き換える。
  • [[ は組み込みコマンドとして、式の中で言語の基本ルールを変更できる。
  • [[ は文字列比較時にグロブパターンをリテラルとして扱うことで、異なる結果を生むことがある。

シェルスクリプトを書く際の選択

  • 移植性のあるシェルスクリプトを書くなら、[ を使うのがよい。
  • Bash 専用のスクリプトを書くなら、[[ を使うことでより多くの機能を利用できる。

シェル式と test 式の結合

  • シェルは !&&|| 演算子を通じて独自の式を持っている。
  • test 式とシェル式は、1つのコマンドとして結合できる。

GN⁺の意見

この記事で最も重要な点は、Unixシステムにおいて [test が同じ機能を果たす2つの異なるコマンドとして存在していることであり、これはシェルスクリプトの可読性と効率を高めるためだと推測される点である。こうした情報は、初級ソフトウェアエンジニアがシェルスクリプトを書いたり理解したりする際に有用であり、シェルスクリプトの動作原理やさまざまなシェル間の違いを理解する助けにもなるだろう。この記事が興味深いのは、シェルスクリプトの基本的なツールがどのように多様な形で使われうるかを示し、シェルプログラミングの複雑さと柔軟性をよく表しているからだ。

1件のコメント

 
GN⁺ 2023-11-24
Hacker Newsのコメント
  • 原著者からの感謝とタイトル修正の提案

    原著者は、記事が人気を集めたことへの感謝を述べるとともに、タイトルに年号を追加し、test という単語を大文字にしないよう提案している。test は実際のコマンドを意味するためである。

  • Bourneシェルの test コマンドの歴史と個人的な好み

    BourneシェルはIDEがなかった時代に作られたため、丸括弧や角括弧なしで test コマンドが使われていたと説明している。個人的には、角括弧形式よりも test 形式のほうを好むという。

  • if ブロックを使わない条件文の例

    if ブロックなしで条件文を簡潔に書く方法を紹介し、デバッグ出力を条件付きで stderr に出力する例を示している。

  • if ブロックと通常コマンドを組み合わせて使う方法

    if ブロックが通常のコマンドをテストできることを示し、たとえば grep コマンドを使ったログ検索の例を挙げている。

  • test コマンド内で論理演算を使うかどうかの悩み

    test コマンド内で論理演算を使うべきか、別個の条件文を使うべきかについて迷いを示している。性能上の問題がないのであれば、どちらにも妥当な理由があるとしている。

  • test コマンドを使う利点と man test の便利さ

    数年前から、角括弧を使わずに test コマンドを使うのがよいと主張している。これは test が単なるコマンドであることを強調でき、man bash を探すより man test を使うほうが便利だと説明している。

  • [test の単一引数の挙動に関する注意

    変数が空でないことを確認するとき、変数を引用符で囲まないと予期しない結果を招くことがあると警告している。変数は引用符で囲むべきだと強調している。

  • LinuxとNetBSDにおける /bin/[/bin/test の違い

    Linuxでは /bin/[/bin/test は異なるが、NetBSDでは同じであることを共有している。

  • test / [ / [[ のより深い探究と、シェルの奇妙な点に関するブログリンクの共有

    test[[[ をより深く理解する助けとなる文書と、シェルのさまざまな特徴を説明するブログへのリンクを共有している。

  • [[ はbash専用であることの指摘と、bash使用が確実なら [[ を使うべきとの助言

    [[ がbash専用コマンドであることに触れ、bashを使うことが確実なら [[ を使うのがよいと助言している。

  • [ がbashスクリプト言語の一部ではないという認識に対する混乱

    [ がbashスクリプト言語の一部ではなく単なるプログラムであることを理解するのに混乱があったと述べ、その説明を求めている。

  • シェルに対する強い意見と [ 使用への反対

    [ を使わず、test だけを使うべきだという強い意見を述べている。[ は言語の文法のように見えるが、実際にはプログラムである点を強調し、文字列評価には case 文を使うべきだと主張している。