GNU/Linux >> Belajar Linux >  >> Linux

Mengapa Substitusi Proses Bash Tidak Bekerja Dengan Beberapa Perintah?

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.


Linux
  1. Mengapa Ekspresi Reguler Bekerja Di X Tapi Tidak Di Y?

  2. Mengapa Cd Bukan Program?

  3. Memetakan Metadata Dengan Avconv Tidak Berfungsi?

  1. Mengapa File Terjemahan Bash Tidak Berisi Semua Teks Kesalahan?

  2. Perintah Rm Dalam Skrip Bash Tidak Bekerja Dengan Variabel?

  3. Mengapa bash tidak berhenti pada kesalahan karena kegagalan dalam urutan perintah hubung singkat?

  1. Mengapa membuat gambar memberi saya file, bukan gambar?

  2. Mengapa regex ini tidak berfungsi di linux?

  3. Mengapa find -mtime tidak berfungsi seperti yang diharapkan pada file dengan zona waktu berbeda?