/bin/sh
mungkin ada bash
di sistem Anda, tetapi ketika dipanggil sebagai sh
, bash
akan berjalan dalam mode POSIX (seolah-olah POSIXLY_CORRECT
didefinisikan, atau dimulai dengan --posix
).
Dalam mode ini, proses substitusi tidak ada.
Solusi:
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
Alternatif:
all:
bash -c "diff <(command1) <(command2)"
Atau cukup definisikan variabel Makefile SHELL
sebagai /bin/bash
:
SHELL=/bin/bash
Jika Anda ingin mudah dibawa, lanjutkan dengan solusi pertama. Jika Anda baik-baik saja dengan ketergantungan bash
, pilih yang kedua. Jika Anda juga tidak perlu peduli dengan make
implementasi non-GNU , gunakan yang ketiga.
Mengenai pengaturan SHELL
: Standar POSIX mengatakan bahwa executable di Makefiles harus dipanggil dengan fungsi system()
C library oleh make
. Fungsi ini tidak dijamin untuk menggunakan SHELL
variabel lingkungan (pada kenyataannya, hal itu tidak disarankan oleh standar). Standar ini juga mengatakan bahwa pengaturan variabel Makefile SHELL
seharusnya tidak mempengaruhi variabel lingkungan SHELL
. Namun, dalam sebagian besar implementasi make
yang saya ketahui, variabel Makefile SHELL
akan digunakan untuk menjalankan perintah.
Saran dalam Dasar Pemikiran untuk make
utilitas adalah menggunakan bash -c
:
Fitur historis MAKESHELL
, dan fitur terkait yang disediakan oleh make
implementasi lain , dihilangkan. Dalam beberapa implementasi itu digunakan untuk membiarkan pengguna menimpa shell untuk digunakan untuk menjalankan make
perintah. Ini membingungkan; untuk portable make
, shell harus dipilih oleh makefile writer. Lebih jauh, seorang makefile writer tidak dapat membutuhkan shell pengganti untuk digunakan dan masih mempertimbangkan makefile portable. Meskipun dimungkinkan untuk membakukan suatu mekanisme untuk menentukan shell alternatif, implementasi yang ada tidak menyetujui mekanisme seperti itu, dan makefile penulis sudah dapat meminta shell alternatif dengan menentukan nama shell dalam aturan untuk target; sebagai contoh:
python -c "foo"
bash
Makefile atau solusi lain untuk masalah diff tanpa menggunakan file sementara?SHELL
ke/bin/bash
dalam Makefile.bash -c
.