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.
#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" ); } } }