establecer variables dentro del subshell cuando se usa

establecer variables dentro del subshell cuando se usa

Estoy usando el siguiente método para pasar comandos a un subshell iniciado por "newgrp".

#!/bin/csh
echo "Before newgrp"
/usr/bin/newgrp users <<EONG
echo "hello from within newgrp"
id
EONG
echo "After newgrp"

Funciona bien siempre y cuando no intente "configurar" nada en el subshell.

es decir

#!/bin/csh
echo "Before newgrp"
/usr/bin/newgrp users <<EONG
echo "hello from within newgrp"
set a=npy
echo $a
id
EONG
echo "After newgrp"

Como puede ver arriba, configuré a=npy dentro del subshell y al hacer un echo $a debería devolver npy. Sin embargo, veo un error porque no se declara.

¿Alguien puede decirme cómo puedo configurar env vars dentro de un subshell mientras uso<<

Respuesta1

La <<construcción introduce un caparazón.aquí documentoeso se trata como si fuera una cadena entre comillas dobles a medida que se lee, por lo que las variables se expanden inmediatamente a medida que el shell las lee. Verá esto claramente si habilita una función de shell que le informa sobre variables no definidas. Usaré esa característica en el shell BASH aquí:

$ set -o nounset
$ echo "$a"
bash: a: unbound variable
$ bash <<EOF
> a=foo
> echo "$a"
> EOF
bash: a: unbound variable

Para evitar que el shell expanda las variables en el documento aquí mientras se lee, puede poner la etiqueta entre comillas simples o una barra invertidacada uso decadavariable:

$ bash <<'EOF'
> a=foo
> echo "$a"
> EOF
foo

$ bash <<EOF
> a=foo
> echo "\$a"
> EOF
foo

Tenga en cuenta que los tipos de comillas utilizadas alrededor de la variable dentro del documento aquí no tienen nada que ver con si el shell expande o no la variable mientras se lee el documento aquí.

PDSiempre coloque comillas dobles en las expansiones de sus variables para que no generen coincidencias no deseadas de nombres de archivos GLOB.

ppActive la verificación de variables indefinidas en sus shells para detectar sus errores de escritura. Esto le habría dado una idea de su problema.

pppNo utilice shells C para secuencias de comandos. tienen muchos errores yinconsistencias

Respuesta2

Estás utilizando un documento aquí delimitado por la EONGcadena.

Al introducir documentos aquí con <<word, si el documento aquí está sujeto o no a expansión depende de si algún carácter enpalabrase cita. Cuando no se cita ningún carácter, el documento aquí está sujeto a expansión de parámetros, sustitución de comandos y expansión aritmética. Cuando se cita al menos un carácter, el aquí-documento no está sujeto a ampliación; Los shells Bourne y Korn (y POSIX) utilizan un código totalmente sin comillaspalabracomo delimitador final, mientras que los shells C usanpalabracomo es.

Podrías reescribir tu ejemplo como:

#!/bin/csh
echo "Before newgrp"
/usr/bin/newgrp users <<"EONG"
echo "hello from within newgrp"
set a=npy
echo $a
id
"EONG"
echo "After newgrp"

De lo contrario, con un sin comillaspalabra, debe escapar $apara \$aevitar que el shell lo sustituya antes de pasarlo como entrada estándar a newgrp:

#!/bin/csh
echo "Before newgrp"
/usr/bin/newgrp users <<EONG
echo "hello from within newgrp"
set a=npy
echo \$a
id
EONG
echo "After newgrp"

información relacionada