ポジローぽけっと

昨日より今日、今日より明日を信じて、トライトライ

unix コマンド 大文字 小文字 区別

エントリのタイトルは普通「区別する」らしいのだが、cygwinとmacの[ls]や[echo]が大文字で通る理由が分からない(ubuntuは区別する)。これに気づいたのは「ゲームで極める シェルスクリプトスーパーテクニック」の本文内で、環境によって仕様の異なる[echo]を統一して扱うために新たにシェルスクリプトを書いて[ECHO]を定義する(2.6節)を読んでいた時のことだった。

シェルスクリプトで定義して、使うのだから新たに[ECHO]が実装されたと思えばいいのだが、実装前から[ECHO]が通るorz。[type]でどのコマンド呼んでるか調べれば、

[warupoke ~/test ] $ type -a echo
echo is a shell builtin
echo is /bin/echo
[pojitiveman ~/textbooks/test ] $ type -a ECHO
ECHO is /bin/ECHO

ふむふむ、どうやら/bin/に二つありそうだ。

[warupoke /bin ] $ ls
[          date       expr       ln         pwd        stty       zsh
bash       dd         hostname   ls         rcp        sync
cat        df         kill       mkdir      rm         tcsh
chmod      domainname ksh        mv         rmdir      test
cp         echo       launchctl  pax        sh         unlink
csh        ed         link       ps         sleep      wait4path

え、[echo]しかない。これは一体どういうことでしょうか?[ls]もやってみると同様の結果。僕には謎だ。!ってか/bin/にあるの全部なるんじゃないか。ググりまくった結果、MacOSXファイルシステムHFS+はデフォルトでは大文字小文字を区別しないらしい。これが原因か。cygwinはwindows上にあるのでファイルシステムはNTFS。Oh my God!区別しませーん。なんか、もう嫌になっちゃったなw
P.S.

  1. 危うく[ls]のソースコード読むところだった。馬鹿でした。でも勉強のためには読むのはありだなぁ。5000行、ひー!
  2. windowsのファイルシステムを調べるCコード(ソース元
#include<stdio.h>
#include<Windows.h>
int main(){
  char* drive = "C:\\";
  char buffer[0x80];
// ボリューム情報を取得して、ファイルシステム名を取得する
  if ( GetVolumeInformation( drive, NULL, 0, NULL, NULL, NULL, buffer, sizeof( buffer ) ) ) 
  {
    // 取得したファイルシステム名を検証する
    printf( "%sのファイルシステムは", drive );

    if ( 0 == strcmp( "NTFS", buffer ) ){
      printf( "NTFSです\n" );
    }else if ( 0 == strcmp( "FAT", buffer ) ){
      printf( "FATです\n" );
    }else if ( 0 == strcmp( "CDFS", buffer ) ){
      printf( "CDFSです\n" );
    }else if ( 0 == strcmp( "UDF", buffer ) ){
      printf( "UDFです\n" );
    }else{
      printf( "未知のファイルシステムです\n" );
    }   
  }
}