シェルスクリプトでは、まずディレクトリにCDを挿入し、次にコマンドを実行するか、フルパスを作成する方が高速またはより良いと見なされますか?例:最初に書いてから書き込むcd /directory1/
ことをお勧めmkdir subdirectory/
しますmkdir /directory1/subdirectory/
。
ディレクトリでいくつかのコマンドを実行する必要がある場合(上記の例では複数のサブディレクトリを作成する)、答えは変わりますか?
mkdir /directory1/subdirectory/
それが実際に行われていると言うときcd /directory1/
、またはmkdir subdirectory/
行われていないと言うとき?
mkdirは単なる例ですが、この質問は多くの同様のコマンドに適用できます。
答え1
これは実際にあなたが決める問題です。この決定に影響を与える可能性のある要因は、審美的に満足しているか読みやすいかどうかです。実行速度の面では大きな違いはありません。
既存のディレクトリの下に3つのサブディレクトリを作成できます/path/to/dir
。
mkdir /path/to/dir/a \
/path/to/dir/b \
/path/to/dir/b
( cd /path/to/dir && mkdir a b c )
cd
(サブシェルを使用すると元の作業ディレクトリに戻ることができます)
中かっこ拡張を知っているシェルを使用する(cd
シェルが呼び出す前に中かっこ拡張を拡張するので、これは本質的に上記の-lessバージョンと同じですmkdir
):
mkdir /path/to/dir/{a,b,c}
ユーティリティはCライブラリ関数をmkdir
使用できます。この関数は、mkdir()
作成したいディレクトリを作成する前に作業ディレクトリ1を変更しません。
特定の作業ディレクトリでの実行に興味のあるスクリプトを実行すると、状況が異なります。スクリプトが現在の作業ディレクトリ外の相対パスを使用してファイルを見つけることを期待している場合は、明らかにコマンドを実行する前に作業ディレクトリが正しいことを確認する必要があります。
( cd directory && thescript )
...スクリプトが直接実行しない限り。
1 少し修正: Linux では、次のコマンドを使用します。mkdir -p a/b/c
〜する、、、、を呼び出しますが、OpenBSDではmkdir("a")
、、、。のみ呼び出します。 Linuxでは、追加の個別のディレクトリを作成するだけで。chdir("a")
mkdir("b")
chdir("b")
mkdir("c")
mkdir("a")
mkdir("a/b")
mkdir("a/b/c")
a/b/c/d
mkdir a/b/c/d
mkdir("a/b/c/d")
したがって、Linuxでは、mkdir -p
ディレクトリの作成時に各中間パスが実際に内部的に「一度実行」されます(noを使用するとこれは実行されません)。cd
mkdir
-p
-p
mkdir
このユーティリティには、不足している中間ディレクトリを生成するためのフラグがありますが、明らかにBSDとLinux開発者はこれを少し異なって実行します。
答え2
ディレクトリで操作を実行し、chdir
短い名前を使用してそのディレクトリのファイルにアクセスする方が、ファイルの絶対パス名を使用するよりもはるかに高速です。
一方、特定のディレクトリにあり、他のディレクトリにある多くのファイル名引数を使用してコマンドを呼び出す場合は、絶対パス名を使用する方が安全で理解しやすくなります。
注:より長いディレクトリパス()を作成し、コマンドが準備されたa/b/c/...
ときにそのリスト内のすべてのディレクトリが存在するようにするには、ディレクトリを作成し、chdirを作成してから次のディレクトリに進むことをお勧めします。 。これにより、パスがPATH_MAX
。