存在する場合、mkdir -p はエラーを返します。

存在する場合、mkdir -p はエラーを返します。

Raspbian Stretch Lite:

$ mkdir --help
Usage: mkdir [OPTION]... DIRECTORY...
Create the DIRECTORY(ies), if they do not already exist.

Mandatory arguments to long options are mandatory for short options too.
  -m, --mode=MODE   set file mode (as in chmod), not a=rwx - umask
  -p, --parents     no error if existing, make parent directories as needed
  -v, --verbose     print a message for each created directory
  -Z                   set SELinux security context of each created directory
                         to the default type
      --context[=CTX]  like -Z, or if CTX is specified then set the SELinux
                         or SMACK security context to CTX
      --help     display this help and exit
      --version  output version information and exit

私が書いたスクリプトでは、次のようになります。

mkdir -p /mnt/target/home/user/resources

どこに/mnt/target/home/user/resources存在できますか?この場合、スクリプトは次のエラーで停止します。

mkdir: '/mnt/target/home/user/resources' ディレクトリを作成できません。ファイルが存在します。

しかし、マニュアルページにはエラーが存在する場合、エラーを返すべきではないとされています!

修正する

ファイルがありませんresources:

$ ls -la /mnt/target/home/user/
totale 13
drwxr-xr-x 4 mark      mark      1024 gen 10 16:56 .
drwxr-xr-x 4 root      root      1024 gen 10 16:56 ..
-rw-r--r-- 1 mark      mark       220 nov 13 14:09 .bash_logout
-rw-r--r-- 1 mark      mark      3523 nov 13 14:09 .bashrc
drwxr-xr-x 3 root      root      1024 gen 10 16:56 bin
-rw-r--r-- 1 mark      mark       675 nov 13 14:09 .profile
drwxr-xr-x 2 root      root      4096 gen  1  1970 resources

アップデート2

スクリプトの周辺コードは次のとおりです。

losetup -P /dev/loop0 image.img
e2fsck -f /dev/loop0p2
resize2fs /dev/loop0p2
mkfs.ext4 /dev/loop0p3
e2fsck -f /dev/loop0p3
mkfs.vfat -F 32 /dev/loop0p4

mount /dev/loop0p2 /mnt/target

cd /mnt/target/home/
tar cf home.tgz user/
rm -r user/

mount /dev/loop0p1 /mnt/target/boot/
mount /dev/loop0p3 /mnt/target/home/

tar xf home.tgz -C /mnt/target/home/

#mkdir -p /mnt/target/home/user/resources
mount /dev/loop0p4 /mnt/target/home/user/resources

image.img4つのパーティションが含まれています。

答え1

mount /dev/loop0p2 /mnt/target
cd /mnt/target/home/
mount /dev/loop0p3 /mnt/target/home/
mkdir -p /mnt/target/home/user/resources

mkdir作業ディレクトリをオン/homeに設定して電話をかけています/dev/loop0p2。作業ディレクトリは以前はパスを介してアクセスできましたが、/mnt/target/home今は隠されています/dev/loop0p3。呼び出すと、mkdirpathはのディレクトリを参照します/mnt/target/home//dev/loop0p3

なぜ作業ディレクトリに興味があるのか​​分かりませんが、mkdir奇妙に見えます。質問にスクリプトを表示する前にスクリプトを単純化した場合、現在発生している問題は、マウントポイントの後ろに隠されたディレクトリが複雑になっている可能性があります。

したがって、インストールする前に終了してみてくださいcd。または/mnt/target/homeまったく使用しないで、通話オプションとを使用してください。cd-Ctarrm

通常、何らかの方法で使用されるディレクトリに何かをインストールしないでください。ターゲットディレクトリは空でなければならず、プロセスの作業ディレクトリではありません。オペレーティングシステムは正しいことをしますが、それが正しいと思うことは驚くことがあり、これはとにかく人間とソフトウェアを混乱させる可能性があります。

関連情報