-p
フラグをmkdir
デフォルトで設定しない理由はわかりません。
-p, --parents no error if existing, make parent directories as needed
それは私が見ることができるものからの非破壊的なコマンドです。これが機能する方法について重要な何かを見逃しましたか?
次に、これをデフォルトの動作にする簡単な方法はありますmkdir
か?
mkdp
-p
フラグをmkdir
デフォルトで設定しない理由はわかりません。
-p, --parents no error if existing, make parent directories as needed
それは私が見ることができるものからの非破壊的なコマンドです。これが機能する方法について重要な何かを見逃しましたか?
次に、これをデフォルトの動作にする簡単な方法はありますmkdir
か?
mkdp
回答:
これはオプションの機能であり、特にスクリプトでは常に望ましいとは限りません。スクリプトの場合は、次の欠点を考慮してください。
/usr/local/lib/GreatSoftware/ImportantPartOfIt
が、ライブラリは/の下にあるものへの/リンクに依存しています/usr/local/lib/GreatSoftware
。これがない場合、スクリプトは続行されません。の一般的な動作はmkdir
、そのような状況が報告され、すぐに捕捉できるため、簡単かつ自然になります。
mkdir -p
シェルで常に使用する場合は、エイリアスを作成できます。
alias mkdir='mkdir -p'
(これは.bashrc
、シェルが使用する構成または任意の構成に移動する必要があります。)
alias mkdp="mkdir -p"
ことをお勧めします。
.bashrc
は、(通常)環境に影響を与えません。
alias rm='rm -i'
です。
rm -i
エイリアスが常に悪いとは思いません-悪い習慣につながるかもしれません。確かにないすべてのコマンドエイリアスは、同様に良い/悪いです-考えるls="ls --color=auto"
か、ssh="TERM=xterm ssh"
例えば。
もちろん、親ディレクトリの作成をデフォルトにすべきだと主張することもできます。親が存在しない場合、いくつかのチェックオプションを使用してディレクトリの作成を防ぐことができます。
しかし、それが逆になっている理由は単なる歴史です。mkdirの基本バージョンでは、親ディレクトリは作成されませんでした。これが、X11ディストリビューションに、このタスクを実行できるmkdirhierというコマンドが付属している理由です。親ディレクトリが存在するかどうかを確認し、必要に応じて作成します。
後でこの機能が多くのUNIXバージョンのコマンドmkdirに追加されました(最近のPOSIX標準にあるかどうかはわかりません)。互換性を維持するために、この機能はオプションフラグをオンにすることで利用できるようになりました-p
。
デフォルトでオンにするのが悪いのはなぜですか?親ディレクトリが存在しない場合、スクリプトはmkdirの失敗に依存する場合があります。特にユーザーrootとして、デフォルトでディレクトリツリーを作成するのは危険な場合があります。
例:
if mkdir /backup/$(uname -n)/$(date +%Y%m%d)
then
perform_backup ...
この例では、ディレクトリが作成され、ファイルシステム/backup
がマウントされていなくてもバックアップが実行され/backup/$(uname -n)
、デフォルトが逆の場合、親は存在しません。
経験則:ツールのデフォルトの動作を変更しないことをお勧めします。必要に応じて、デフォルトの動作を変更できるオプションを提供します。
始まり、唯一の裸があったmkdir
コマンド。Unixの設計原則に従って、この単純なコマンドは、ディレクトリの作成という1つの単純なタスクを実行しました。
後で、特定のパスが存在することを確認するために呼び出し元がゼロ、1つ、または複数のディレクトリを作成したいという一般的な使用例を処理mkdir
する-p
オプションを取得しました。これは、いくつかの理由でデフォルトの操作にはなりませんでした。まず、すべてのシステムがこのより複雑な機能を備えているわけではなく、-p
オプションを必要とすることは、それを使用するスクリプトがmkdir: invalid option -z
不規則にディレクトリの作成に失敗するのではなく、合理的なエラーメッセージ(など)を受け取ることを意味しました。第2に、そして最も重要なこととして、の動作mkdir -p
はmkdir
、すべての場合において互換性のある代替ではありません。
特に、ほとんどのファイルシステムでmkdir
は、アトミック操作です。プログラムが実行さmkdir playground
れ、コマンドが成功した場合、プログラムはplayground
ディレクトリを作成したことを認識しています。これにより、プログラムは新しいディレクトリを専用の遊び場として扱うことmkdir playground
ができます。同じプログラムの別のインスタンスが同時に実行されている場合、への呼び出しは失敗します。このプロパティはmkdir -p
、引数の存在を許可するため、明らかに提供されていません。
mkdir -p
最初から存在していた場合はmkdir -a
、単一ディレクトリ作成コマンドのようなもので、それをデフォルトモードにすることができます。しかし、それは通常のUnix設計哲学には従わなかったでしょう。ほとんどの基本的なユーティリティは、基礎となるプリミティブの単純なラッパーであり、手の込んだオプション(複数のディレクトリを一度に作成するなど)を備えています。
alias mkdir="mkdir -p"
。