En ocasiones, la sustitución del proceso no funcionará como se esperaba. Aquí hay un ejemplo:
Entrada:
gcc <(echo 'int main(){return 0;}')
Salida:
/dev/fd/63: file not recognized: Illegal seek
collect2: error: ld returned 1 exit status
Entrada:
Pero funciona como se esperaba cuando se usa con un comando diferente:
grep main <(echo 'int main(){return 0;}')
Salida:
int main(){return 0;}
He notado fallas similares con otros comandos (es decir, el comando que espera el archivo de la sustitución del proceso no puede usar /dev/fd/63
o similar). Esta falla con gcc
es solo el más reciente. ¿Hay alguna regla general que deba tener en cuenta para determinar cuándo fallará la sustitución del proceso de esta manera y no se debe usar?
Estoy usando esta versión de BASH en Ubuntu 12.04 (también he visto esto en arch y debian):
GNU bash, versión 4.3.11(1)-release (i686-pc-linux-gnu)
Respuesta aceptada:
La sustitución de procesos da como resultado un archivo especial (como /dev/fd/63
en su ejemplo) que se comporta como el extremo de lectura de una canalización con nombre. Este archivo se puede abrir y leer, pero no escribir, no buscar.
Los comandos que tratan sus argumentos como flujos puros funcionan, mientras que los comandos que esperan buscar en los archivos que se les dan (o escribir en ellos) no funcionarán. El tipo de comando que funcionará es lo que generalmente se considera un filtro:cat
, grep
, sed
, gzip
, awk
, etc... Un ejemplo de un comando que no funcionará es un editor como vi
o una operación de archivo como mv
.
gcc
quiere poder realizar un acceso aleatorio en sus archivos de entrada para detectar en qué idioma están escritos. Si en su lugar le das gcc
una pista sobre el idioma del archivo de entrada, está feliz de transmitir el archivo:
gcc -x c <(echo 'int main(){return 0;}')
La forma más simple y directa sin sustitución de procesos también funciona:
echo 'int main(){return 0;}' | gcc -x c -
Tenga en cuenta que esto no es específico de bash
. Todos los shells que admiten la sustitución de procesos se comportan de la misma manera.