Saya sering menemukan sintaks Bash sangat membantu, misalnya proses substitusi seperti di diff <(sort file1) <(sort file2)
.
Apakah mungkin menggunakan perintah Bash seperti itu di Makefile? Saya sedang memikirkan sesuatu seperti ini:
file-differences:
diff <(sort file1) <(sort file2) > $@
Di GNU Make 3.80 saya ini akan memberikan kesalahan karena menggunakan shell
bukannya bash
menjalankan perintah.
/bin/sh: -c: line 0: syntax error near unexpected token
('`Jawaban:
Dari dokumentasi GNU Make,
Jadi letakkan
SHELL := /bin/bash
di bagian atas makefile Anda, dan Anda harus baik-baik saja.BTW: Anda juga dapat melakukan ini untuk satu target, setidaknya untuk GNU Make. Setiap target dapat memiliki tugas variabelnya sendiri, seperti ini:
Itu akan mencetak:
Lihat "Nilai Variabel Target-spesifik" dalam dokumentasi untuk rincian lebih lanjut. Baris itu dapat pergi ke mana saja di Makefile, tidak harus langsung sebelum target.
sumber
man
. Bicara tentang penentuan waktu. : Pinfo
sebenarnya, tapi, kurasa itu sangat membantu Andy. Saya tahu saya pernah mengalami hari-hari seperti itu ...SHELL=/bin/bash
sebagai baris pertama dari Makefile (atau tepat setelah komentar).Anda dapat menelepon
bash
langsung, menggunakan-c
bendera:Tentu saja, Anda mungkin tidak dapat mengalihkan ke variabel $ @, tetapi ketika saya mencoba melakukan ini, saya mendapat
-bash: $@: ambiguous redirect
pesan kesalahan, jadi Anda mungkin ingin melihat ke dalamnya sebelum Anda terlalu ke ini (meskipun saya menggunakan bash 3.2.something, jadi mungkin milik Anda bekerja secara berbeda).sumber
Jika portabilitas penting, Anda mungkin tidak ingin bergantung pada shell tertentu di Makefile Anda. Tidak semua lingkungan memiliki pesta.
sumber
Anda dapat memanggil bash langsung di dalam Makefile Anda alih-alih menggunakan shell default:
dari pada:
sumber
make
mengabaikan nilai variabel lingkungan SHELL.Ada cara untuk melakukan ini tanpa secara eksplisit mengatur variabel SHELL Anda untuk menunjuk ke bash. Ini bisa berguna jika Anda memiliki banyak makefile karena SHELL tidak diwarisi oleh makefiles berikutnya atau diambil dari lingkungan. Anda juga perlu memastikan bahwa siapa pun yang mengkompilasi kode Anda mengonfigurasi sistem mereka dengan cara ini.
Jika Anda menjalankan
sudo dpkg-reconfigure dash
dan menjawab 'tidak' pada prompt, sistem Anda tidak akan menggunakan tanda hubung sebagai shell default. Kemudian akan menunjuk ke bash (setidaknya di Ubuntu). Perhatikan bahwa menggunakan tanda hubung sebagai shell sistem Anda sedikit lebih efisien.sumber
sh
, bash berjalan dalam mode kompatibilitas (set -o posix
). Fungsionalitas yang OP coba gunakan, proses substitusi, tidak tersedia dalam mode ini.Salah satu cara yang juga berfungsi adalah dengan meletakkannya di baris pertama dari target Anda:
sumber