
Cuando creas tutoriales en línea para que las personas los usen en una sola terminal, a veces es bueno obtener código en línea... sin embargo, ninguno de estos funcionó como esperaba. Esperaría foo
ser "bar" para todos estos. ¿Alguien sabe por qué?
#!/usr/bin/env bash
source <(echo "export foo=bar");
echo "$foo"
source <(cat <<< "export foo=bar");
echo "$foo"
source <(cat <<EOF
export foo=bar
EOF
);
echo "$foo"
Mi única suposición es que source
no se puede leer un descriptor de archivo. También intenté usar .
en lugar de source
lo mismo.
Estoy en MacOS, bash --version
salida:
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18) Copyright (C) 2007 Free Software Foundation, Inc.
Respuesta1
Esto no funcionaría en bash
versiones anteriores a la 4.0 (por ejemplo, la versión predeterminada bash
en macOS, que es la versión 3.2.57(1)).
La versión 4.0 tuvo una corrección de errores:
Se corrigió un error que causaba `.' no poder leer ni ejecutar comandos de archivos no normales, como dispositivos o canalizaciones con nombre.
(eso es dehttps://tiswww.case.edu/php/chet/bash/CAMBIOS)
El archivo leído por source
(o .
) cuando lo usa con una sustitución de proceso no es un archivo normal, por lo que desencadenaría el error que se solucionó en la versión 4.0.
La versión más reciente es actualmente la versión 5.0.7(1), donde su código funciona como se esperaba.