GNU/Linux >> Tutoriales Linux >  >> Linux

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

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.


Linux
  1. ¿Por qué la expresión regular funciona en X pero no en Y?

  2. ¿Por qué Cd no es un programa?

  3. ¿Por qué el archivo de traducción de Bash no contiene todos los textos de error?

  4. Linux – ¿Por qué Locale Es_mx funciona pero no Es?

  5. ¿El comando Rm en Bash Script no funciona con variables?

Linux:¿por qué no funciona Setuid?

¿Por qué no funciona el autocompletado cuando se escribe un nombre de comando después de `fuente`?

¿Por qué `exit &` no funciona?

¿Por qué bifurcar mi proceso hace que el archivo se lea infinitamente?

¿Por qué esta expresión regular no funciona en Linux?

¿Por qué find -mtime no funciona como se esperaba en archivos con diferentes zonas horarias?