Інколи процес заміни не буде працювати, як очікувалося. Ось приклад:
Вхід:
gcc <(echo 'int main(){return 0;}')
Вихід:
/dev/fd/63: file not recognized: Illegal seek
collect2: error: ld returned 1 exit status
Вхід:
Але він працює, як очікувалося, при використанні з іншою командою:
grep main <(echo 'int main(){return 0;}')
Вихід:
int main(){return 0;}
Я помітив подібні збої з іншими командами (тобто команда, яка очікує, що файл від заміни процесу не може використовувати /dev/fd/63
або подібні). Ця невдача з gcc
- лише найсвіжіша. Чи є якесь загальне правило, яке мені слід знати, щоб визначити, коли заміна процесу не вдасться таким чином і не повинна застосовуватися?
Я використовую цю версію BASH на Ubuntu 12.04 (я також бачив це в arch та debian):
GNU bash, версія 4.3.11 (1) -випуск (i686-pc-linux-gnu)
gcc -xc <(echo 'int main(){return 0;}')
(яка встановлює мову C
явно).
illegal seek
виглядає як відповідь - те, на|pipe
щоbash
вказує виконана програма, - це не файл, який можна шукати. ймовірно, якщо ви не можете успішно виконатиecho data | command /dev/fd/0
програму, тоді у вас буде схожа удача<(cmd)
. Він не містить файлу на диску - він просто замінює аргумент, який вказує на дескриптор файлу труб.