mkdirに入れ子になったディレクトリの作成を許可するようにデフォルトで-pフラグが設定されていないのはなぜですか?

mkdirに入れ子になったディレクトリの作成を許可するようにデフォルトで-pフラグが設定されていないのはなぜですか?

-pフラグがデフォルトで設定されてはならない理由はありません。mkdir

  -p, --parents     no error if existing, make parent directories as needed

私が知る限り、これは非破壊的な命令です。これがどのように機能するかについて重要なことを見逃しましたか?

第二に、これを基本的な動作にする簡単な方法はありますかmkdir

答え1

もちろん、親ディレクトリの作成はデフォルトでなければならず、親ディレクトリが存在しない場合はディレクトリの作成を防ぐために使用できるいくつかの確認オプションがあると主張することもできます。

しかし、その反対が起こる理由は歴史だけです。基本バージョンは目次親ディレクトリは作成されません。これがX11ディストリビューションに次のソフトウェアが付属している理由です。mkedielこれを行うことができます。親ディレクトリがあることを確認し、必要に応じて作成します。

後でこの機能がコマンドに追加されました。目次多くのUNIXバージョンでは(現在POSIX規格にあるかどうかはわかりません)。互換性を維持するために、この機能はオプションフラグをオンにすることによって提供されます-p

基本的にオンになっているのはなぜ悪いのですか?スクリプトは次のように変更できます。目次親ディレクトリがないと失敗します。特にユーザーとしてデフォルトでは、ディレクトリツリーを作成するのは危険です。

例:

 if mkdir /backup/$(uname -n)/$(date +%Y%m%d)
  then
    perform_backup ...

/backupこの例では、/backup/$(uname -n)ファイルシステムがマウントされておらず、親ディレクトリが存在しない場合でも(デフォルトがそうでない場合)、ディレクトリが作成され、バックアップが実行されます。

経験則:ツールのデフォルトの動作を変更しないことをお勧めします。必要に応じてデフォルトの動作を変更するオプションを提供します。

答え2

これはオプションの機能であり、必ずしも必要ではありません。特にスクリプトではさらにそうです。スクリプトの次の欠点を考慮してください。

  • ディレクトリが既に存在していることを報告しません。新しく作成されたディレクトリにいくつかのファイルを配置する必要がありますが、そのディレクトリがすでに存在し、ファイルが含まれている場合、スクリプトは大量の混乱を引き起こす可能性があります。 (後でスクリプトがそこに配置したファイルをフィルタリングするのは面倒です。)
  • 一方、一部のスクリプト(またはその一部)は、以前に作成されたディレクトリ構造(おそらく他のパッケージ/スクリプトによって生成される)に依存する可能性があります。たとえば、パッケージインストールスクリプトはライブラリをサブディレクトリに配置する必要がありますが、/usr/local/lib/GreatSoftware/ImportantPartOfItそのライブラリは以下のエントリに依存またはリンクされています/usr/local/lib/GreatSoftware。このコンテンツがない場合、スクリプトを続行できません。

の普遍的な行動は、mkdirそのような状況が報告され、すぐに発見される可能性があるため、それを単純かつ自然にします。


mkdir -pシェルで常に使用するには、エイリアスを作成できます。

alias mkdir='mkdir -p'

.bashrc(これは構成またはシェルが使用するすべてのものに従う必要があります。)

答え3

これは哲学だと思います。裸の目次(1)コマンド(オプションなし)は、以下を示します。目次(2)システムコールはシェルにその機能を提供し、それ以上もそれ以下もしません。

答え4

私にとって問題は、-pオプション(デフォルトオプションの場合)の動作が本質的に副作用であることです。要求された操作以外の操作を実行して、コマンドの複雑さを増やします。これは覚えておくべき別の見えないものです。良いプログラミング習慣の基本的なルールの1つは、副作用を避けることです。

現代のプログラミング言語は非常に強力なので、その言語が提供する基本要素から必要とされる複雑なコマンドを書くのは比較的簡単です。そのためには、どのような行動が必要かについて意識的な決定を下し、達成された内容の具体的かつ可視的な記録を残さなければなりません。

関連情報