Built-in test
dan [
utilitas memiliki tes -nt
("lebih baru dari") dan -ot
("lebih tua dari") di sebagian besar shell, bahkan ketika shell berjalan dalam "mode POSIX" (juga berlaku untuk utilitas eksternal dengan nama yang sama pada sistem yang saya punya akses). Tes ini untuk membandingkan cap waktu modifikasi pada dua file. Semantik terdokumentasi mereka sedikit berbeda di seluruh implementasi (berkaitan dengan apa yang terjadi jika satu atau file lain ada pada tidak), tetapi mereka tidak termasuk dalam spesifikasi POSIX. untuk test
utilitas .
Mereka tidak dibawa maju ke
test
utilitas ketika perintah kondisional dihapus dari shell [KornShell] karena mereka belum dimasukkan ke dalamtest
utilitas yang dibangun ke dalam implementasi historissh
utilitas.
Dengan asumsi saya ingin membandingkan timestamp modifikasi antara file dalam /bin/sh
skrip shell dan kemudian mengambil tindakan tergantung pada apakah satu file lebih baru dari yang lain, seperti pada
if [ "$sigfile" -nt "$timestamp" ] ||
[ "$sigfile.tmp" -nt "$timestamp" ]
then
return
fi
... utilitas lain apa yang bisa saya gunakan, selain dari make
(yang akan membuat sisa skrip sulit untuk sedikitnya)? Atau haruskah saya berasumsi bahwa tidak ada orang yang akan menjalankan skrip pada "implementasi historis sh
", atau mengundurkan diri untuk menulis untuk shell tertentu seperti bash
?
sumber
-nt
fiturtest
dengan cara yang diharapkan sejak kira-kira. 1995. Anda harus menggunakanfind
ekspresi basd bahkanbash
jika Anda suka perilaku yang benar.Jawaban:
POSIXLY:
Menggunakan path absolut ke file mencegah false positive dengan nama file hanya berisi baris baru.
Jika menggunakan jalur relatif, maka ubah
find
perintah ke:sumber
$f1
hanya berisi baris baru;)-exec echo x \;
atau serupa?-printf
akan mudah jika standarfind
status keluar tidak tergantung pada apa tesfind
pengembalian individu - kecuali mungkin jika ada kesalahan dalam benar-benar menjalankan tes tersebut.find
keluar 0 bahkan jika tidak ada file yang ditemukan.[ / -nt /nofile ]
bervariasi dengan implementasi (tetapi tidak pernah menghasilkan kesalahan).Ini bisa menjadi kasus untuk menggunakan salah satu perintah Unix tertua
ls
,.Hasilnya benar jika a lebih baru dari b.
sumber
-
(hilang--
). Anda-L
harus setara dengan-nt
. Itu tidak berfungsi untuk membandingkanx
dan$'x\nx'
misalnya.Anda mengajukan pertanyaan menarik dan mengajukan klaim yang pertama-tama harus diverifikasi.
Saya memeriksa perilaku:
dengan berbagai kerang. Inilah hasilnya:
bash Tidak berfungsi - tidak mencetak apa pun.
Bosh berhasil
dash Tidak bekerja - tidak mencetak apa pun.
ksh88 Tidak berfungsi - tidak mencetak apa pun.
ksh93 bekerja
mksh Tidak berfungsi - tidak mencetak apa pun.
cetakan mewah : mewah: [: -nt: operator / operan yang tidak terduga
yash bekerja
zsh berfungsi di versi yang lebih baru , versi yang lebih lama tidak mencetak apa pun
Jadi empat dari sembilan shell mendukung fitur -nt dan mengimplementasikannya dengan benar. Dengan benar dalam hal ini berarti: dapat membandingkan perangko waktu pada platform terbaru yang mendukung rincian waktu perangko kedua . Perhatikan bahwa file yang saya pilih berbeda biasanya hanya beberapa mikrodetik dalam perangko waktunya.
Karena lebih mudah untuk menemukan
find
implementasi yang berfungsi , saya sarankan untuk menggantioleh
find
ekspresi berbasis.berfungsi setidaknya selama
$file1
tidak hanya berisi baris baru.sedikit lebih lambat tetapi berfungsi dengan benar.
BTW: Mengenai make saya tidak bisa berbicara untuk semua implementasi make, tetapi
SunPro Make
mendukung perbandingan waktu dengan granularity nanosecond sejak kira-kira. 20 tahun, sementarasmake
dangmake
menambahkan fitur ini baru-baru ini.sumber
find
implementasi seperti busybox atau heirloom-toolchest akan memiliki batasan yang sama.-L
untuk yangfind
versi setara dengan-nt
. Itu juga akan gagal pada nama file yang dimulai dengan-
atau!
,(
...find
punyafind -f "$file"
untuk itu tetapi tidak portabel.