Nhân dịp quá trình thay thế sẽ không làm việc như mong đợi. Đây là một ví dụ:
Đầu vào:
gcc <(echo 'int main(){return 0;}')
Đầu ra:
/dev/fd/63: file not recognized: Illegal seek
collect2: error: ld returned 1 exit status
Đầu vào:
Nhưng nó hoạt động như mong đợi khi được sử dụng với một lệnh khác:
grep main <(echo 'int main(){return 0;}')
Đầu ra:
int main(){return 0;}
Tôi đã nhận thấy các lỗi tương tự với các lệnh khác (tức là lệnh mong muốn tệp từ thay thế quá trình không thể sử dụng /dev/fd/63
hoặc tương tự). Thất bại gcc
này chỉ là gần đây nhất. Có một số quy tắc chung mà tôi cần lưu ý để xác định khi nào quá trình thay thế sẽ thất bại theo cách này và không nên được sử dụng?
Tôi đang sử dụng phiên bản BASH này trên Ubuntu 12.04 (Tôi cũng đã thấy phiên bản này trong arch và debian):
GNU bash, phiên bản 4.3.11 (1) -release (i686-pc-linux-gnu)
gcc -xc <(echo 'int main(){return 0;}')
(mà đặt ngôn ngữ để C
rõ ràng).
illegal seek
trông giống như những câu trả lời -|pipe
màbash
chỉ các chương trình thực hiện để không phải là một tập tin seekable. có lẽ nếu bạn không thể thành côngecho data | command /dev/fd/0
tại một chương trình thì bạn sẽ gặp may mắn tương tự<(cmd)
. Nó không cung cấp một tệp trên đĩa - nó chỉ thay thế một đối số trỏ đến một bộ mô tả tệp ống.