Perintah ini, ketika dijalankan sendiri, menghasilkan hasil yang diharapkan (baris terakhir dari crontab):
tail -n 1 /etc/crontab
Namun, ketika saya menjalankannya sebagai bagian dari perintah gema untuk mengirim hasil ke file, itu menambahkan ringkasan semua file di direktori kerja, ditambah hasil yang diharapkan:
sudo bash -c 'echo $(tail -n 1 /etc/crontab) > /path/to/file'
Mengapa perintah ini menghasilkan data tambahan?
echo
lakukan di sini? Pertimbangkan jugatail -n 1 /etc/crontab | sudo tee /path/to/file >/dev/null
echo $(stuff)
?Jawaban:
Garis crontab Anda memiliki satu atau lebih tanda bintang
*
di dalamnya, yang menunjukkan "kapan saja". Ketika baris itu diganti dari substitusi perintah, hasilnya adalah sepertiSementara sebagian besar ekspansi lebih lanjut tidak diterapkan pada output substitusi perintah, ekspansi pathname adalah (seperti halnya pemisahan bidang) :
Perluasan Pathname adalah apa yang berubah
*.txt
menjadi daftar nama file yang cocok (globbing), di mana*
cocok dengan semuanya. Hasil akhirnya adalah Anda mendapatkan setiap nama file (tidak tersembunyi) di direktori kerja yang terdaftar untuk setiap*
di baris crontab Anda.Anda bisa memperbaikinya dengan mengutip ekspansi, jika kode yang Anda posting adalah perwakilan dari perintah yang lebih kompleks:
tetapi yang lebih jelas adalah kehilangan
echo
semuanya:Ini harus melakukan apa yang Anda inginkan dan juga lebih sederhana (satu-satunya perbedaan materi lainnya adalah bahwa versi ini akan menghilangkan pemisahan bidang yang jika tidak akan terjadi, sehingga run spasi tidak akan runtuh).
sumber
tail -n -1 /etc/crontab | sudo tee /path/to/file
idiom yang menurut saya paling tidak rentan kesalahan saat mengarahkan output ke file yang memerlukan hak superuser.Mari kita pertimbangkan direktori dengan file-file ini:
Sekarang, mari kita jalankan perintah tail:
Di atas adalah baris terakhir
crontab
dan inilah yang kami harapkan. Namun:Kutipan ganda menghilangkan masalah ini:
Tanpa tanda kutip ganda, hasil substitusi perintah diperluas oleh shell. Salah satu ekspansi adalah ekspansi pathname . Dalam kasus di atas, ini berarti
f*
diperluas untuk mencocokkan setiap nama file yang dimulai denganf
.Kecuali Anda secara eksplisit menginginkan ekspansi shell, masukkan semua variabel shell Anda dan / atau substitusi perintah di dalam tanda kutip ganda.
sumber
mecanism globing shell akan diperluas
*
ke file lokal.garis crontab kemungkinan memiliki tempat
*
sebagai pengganti.mis. baris ini dalam crontab dijalankan pada jam 7.47 pagi pada hari minggu, bintang pertama berarti setiap hari, kedua bulan apa saja.
maka Anda
tail
, dan masalahyang akan diperluas
*
ke file lokal.sumber