Pada kesempatan proses substitusi tidak akan bekerja seperti yang diharapkan. Ini contohnya:
Masukan:
gcc <(echo 'int main(){return 0;}')
Keluaran:
/dev/fd/63: file not recognized: Illegal seek
collect2: error: ld returned 1 exit status
Masukan:
Tapi itu berfungsi seperti yang diharapkan ketika digunakan dengan perintah yang berbeda:
grep main <(echo 'int main(){return 0;}')
Keluaran:
int main(){return 0;}
Saya telah melihat kegagalan serupa dengan perintah lain (yaitu perintah yang mengharapkan file dari substitusi proses tidak dapat menggunakan /dev/fd/63
atau serupa). Kegagalan ini dengan gcc
hanyalah yang terbaru. Apakah ada aturan umum yang harus saya ketahui untuk menentukan kapan substitusi proses akan gagal dengan cara ini dan tidak boleh digunakan?
Saya menggunakan versi BASH ini di Ubuntu 12.04 (Saya juga melihat ini di arch dan debian):
GNU bash, versi 4.3.11(1)-release (i686-pc-linux-gnu)
Jawaban yang Diterima:
Proses substitusi menghasilkan file khusus (seperti /dev/fd/63
dalam contoh Anda) yang berperilaku seperti ujung baca dari pipa bernama. File ini dapat dibuka dan dibaca, tetapi tidak ditulis, tidak dicari.
Perintah yang memperlakukan argumen mereka sebagai aliran murni berfungsi sementara perintah yang mengharapkan untuk mencari di file yang mereka berikan (atau tulis kepada mereka) tidak akan berfungsi. Jenis perintah yang akan berfungsi adalah yang biasanya dianggap sebagai filter:cat
, grep
, sed
, gzip
, awk
, dll… Contoh perintah yang tidak berfungsi adalah editor seperti vi
atau operasi file seperti mv
.
gcc
ingin dapat melakukan akses acak pada file inputnya untuk mendeteksi dalam bahasa apa file tersebut ditulis. Jika Anda memberikan gcc
petunjuk tentang bahasa file input, dengan senang hati mengalirkan file:
gcc -x c <(echo 'int main(){return 0;}')
Bentuk lebih sederhana yang lebih mudah tanpa substitusi proses juga berfungsi:
echo 'int main(){return 0;}' | gcc -x c -
Perhatikan bahwa ini tidak khusus untuk bash
. Semua shell yang mendukung proses substitusi berperilaku dengan cara yang sama.