Mengapa beberapa perintah GNU Coreutils memiliki -T/--no-target-directory
opsi? Sepertinya semua yang dilakukannya dapat dicapai dengan menggunakan semantik .
(titik diri) dalam hierarki direktori Unix tradisional.
Mengingat:
cp -rT /this/source dir
The -T
pilihan mencegah salinan dari menciptakan dir/source
subdirektori. Sebaliknya /this/source
diidentifikasi dengan dir
dan isinya dipetakan di antara pohon sesuai. Jadi misalnya /this/source/foo.c
pergi ke dir/foo.c
dan seterusnya, bukan ke dir/source/foo.c
.
Tetapi ini dapat dengan mudah dilakukan tanpa -T
opsi menggunakan:
cp -r /this/source/. dir # Probably worked fine since dawn of Unix?
Secara semantik, komponen titik jejak disalin sebagai anak dir
, tetapi tentu saja "anak" itu sudah ada (jadi tidak harus dibuat) dan sebenarnya dir
itu sendiri, sehingga efeknya adalah yang /this/path
diidentifikasi dir
.
Ini berfungsi dengan baik jika direktori saat ini adalah target:
cp -r /this/tree/node/. . # node's children go to current dir
Apakah ada sesuatu yang dapat Anda lakukan hanya dengan -T
itu dapat merasionalisasi keberadaannya? (Selain dukungan untuk sistem operasi yang tidak mengimplementasikan direktori dot, alasannya tidak disebutkan dalam dokumentasi.)
Apakah dot trick di atas tidak menyelesaikan kondisi balapan yang sama dengan yang disebutkan dalam dokumentasi Info GNU -T
?
.
trick melakukan pekerjaan saat menyalin file, hanya saja tidak ketika mengubah nama basename nya pada saat yang sama!cp /path/to/file /target/dir/.
Jika/target/dir/file
ada dan merupakan direktori, Anda mendapatkan diagnostik yang sama! Tetapi Anda telah menunjukkan apa-T
yang tidak dapat dilakukan tanpanya dalam satu langkah, tanpa syarat balapan: salin file dan ubah namanya tanpa disuntikkan ke subdirektori.