setting variables dentro do subshell ao usar

2

Estou usando o seguinte método para passar comandos para um 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 bem, desde que eu não tente "definir" nada no subshell.

ou seja

#!/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 você pode ver acima, eu defini a = npy dentro do subshell e fazer um echo $ a deve retornar npy. No entanto, vejo um erro como não declarado.

Alguém pode me dizer como eu posso definir env vars dentro de um subshell usando <<

    
por user2174771 14.10.2013 / 14:50

2 respostas

2

A construção << apresenta um documento aqui que é tratado como se fosse uma string de aspas duplas à medida que é lida, então as variáveis se expandem imediatamente como eles são lidos pelo shell. Você veria isso claramente se você habilitar um recurso de shell que informa sobre variáveis indefinidas. Vou usar esse recurso no shell BASH aqui:

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

Para impedir que o shell expanda variáveis no documento aqui como está sendo lido, você pode citar a tag ou barra invertida a cada uso da variável every :

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

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

Observe que os tipos de citações usadas em torno da variável dentro dela documento não tem nada a ver com ou não a variável é expandida pelo shell como o documento aqui está sendo lido.

p.s. Sempre cite duas vezes suas expansões de variáveis para que elas não sejam Acione o nome do arquivo GLOB não intencional.

p.p.s. Ative a verificação da variável indefinida em suas conchas, para capturar seus erros de digitação. Isso teria lhe dado uma pista do seu problema.

p.p.p. Não use shells C para scripts. Eles têm muitos bugs e inconsistências

    
por 14.10.2013 / 18:11
1

Você está usando um documento aqui delimitado pela string EONG .

Ao introduzir aqui-documentos com <<word , se o documento aqui está sujeito a expansão, depende se qualquer caractere em palavra é citado. Quando nenhum caractere é citado, o documento here está sujeito a expansão de parâmetro, substituição de comando e expansão aritmética. Quando pelo menos um caractere é citado, o documento aqui não está sujeito a expansão; Bourne e Korn (e POSIX) shells usam uma palavra totalmente sem aspas como delimitador final, enquanto os shells C usam word como é.

Você pode reescrever seu exemplo 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"

Caso contrário, com uma palavra não citada , você precisa escapar de $a as \$a para evitar que ela seja substituída pelo shell antes de ser passada como stdin para 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"
    
por 14.10.2013 / 17:40