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..
trik yang Anda bicarakan adalah menambahkan/.
ke sumbernya .Masalahnya dengan
cp
/mv
/ln
sebagaimana aslinya dirancang adalah bahwa mereka adalah dua perintah dalam satu ( salin ke dan salin ke ).adalah menyalin A ke B atau menyalin A ke B ( menyalin A ke B / A ) tergantung pada apakah
B
ada dan merupakan direktori atau tidak (dan lebih banyak variasi jika B adalah symlink ke direktori).Itu buruk karena tidak jelas. Jadi implementasi GNU telah menambahkan opsi untuk mengatasinya.
salinan A ke B tanpa memperhatikan. Jika
B
ada dan merupakan direktori, itu akan gagal (kecuali Anda lulus-r
). Bagaimanapun, Anda tidak akan berakhir denganA
file di dalamnyaB
ketika Anda bermaksudA
untuk disalin ke B.Dan:
adalah salinan .
sumber
cp A B
perintah tidak akan melakukan apa yang Anda inginkan. Dan[ -e B ] || [ -L B ] || cp A B
masih memiliki kondisi ras yangcp -Tn A B
tidak memiliki.Itu
-T
dapat memberikan kegagalan jika ada direktori yang salah untuk apa yang seharusnya menjadi file tujuan:Yaitu, alih-alih sukses-di-tak terduga-menyalin-ke-subdir, peringatan dan status keluar yang tidak baik terjadi, yang kemudian dapat menyebabkan skrip dibatalkan, dan manusia memeriksa mengapa ada direktori di mana seharusnya tidak ada menjadi satu.
sumber
Menggunakan bendera juga jauh lebih jelas, dan memiliki risiko lebih kecil dari efek yang tidak diinginkan, ketika perintah digunakan dalam skrip alih-alih dimasukkan secara manual. Menambal titik-titik ke jalan dalam sebuah skrip bisa berakhir dengan segala macam kerusakan tak terduga.
sumber