linux – ¿Por qué la sustitución del proceso BASH no funciona con algunos comandos?

Pregunta:

En ocasiones, la sustitución de procesos no funcionará como se esperaba. Aquí hay un ejemplo:

Aporte:

gcc <(echo 'int main(){return 0;}')

Producción:

/dev/fd/63: file not recognized: Illegal seek
collect2: error: ld returned 1 exit status

Aporte:

Pero funciona como se esperaba cuando se usa con un comando diferente:

grep main <(echo 'int main(){return 0;}')

Producción:

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 la más reciente. ¿Existe alguna regla general que deba conocer para determinar cuándo fallará la sustitución de procesos de esta manera y no se debe utilizar?

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:

La sustitución del proceso da como resultado un archivo especial (como /dev/fd/63 en su ejemplo) que se comporta como el final de lectura de una tubería 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 cambio, le da a gcc una pista sobre el idioma del archivo de entrada, estará 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 soportan la sustitución del proceso se comportan de la misma manera.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım