Como posso passar uma variável de ambiente para um script?

2

Ok, posso exibir uma variável de ambiente na linha de comando:

echo $COLUMNS

E receba uma resposta.

Mas não consigo executar isso de dentro de um script de shell, não recebo nada. Portanto, deve haver uma maneira de importar essa variável de ambiente, mas não consegui encontrar uma solução / explicação simples.

Era uma vez uma lembrança de ver algo como $ENV_COLUMNS , mas isso não é correto (ou está faltando alguma coisa).

Estou tentando algo assim:

    for x in $COLUMNS
     do echo -n "-"
    done
    echo #to get the /n
    
por user3082 13.07.2015 / 08:29

6 respostas

2

Este é um seguimento da sua pergunta anterior e estamos chegando ao que você deseja fazer. Tenho certeza que os outros têm seus próprios estilos para isso, mas talvez isso faça você começar.

#!/bin/bash
SCREEN_WIDTH='stty size | awk '{print $2}''
echo $SCREEN_WIDTH

Esse eco não é o que você está tentando fazer, apenas para demonstrar que colocamos o valor em algum lugar facilmente acessível.

    
por 13.07.2015 / 08:39
1

Você pode tentar

export COLUMNS

Veja este para uma explicação.

Mas você deve nos dizer como é o script chamado. Se for iniciado por algum crontab, é provável que ele seja executado em um ambiente sem COLUMNS . Você pode usar printenv para verificar.

    
por 13.07.2015 / 08:38
1

Uma variável de ambiente é passada para um script. O problema é que COLUMNS não é uma variável de ambiente .

De um script, você pode chamar um comando como tput para recuperar as dimensões do terminal. / p>

width=$(tput cols)
</dev/zero head -c "$width" | tr '
width=$(tput cols)
</dev/zero head -c "$width" | tr '%pre%' '-'; echo
' '-'; echo

(Este script pode não ser portável além do Linux.)

    
por 14.07.2015 / 03:15
0

Não é um aswer para a sua pergunta, mas ... por que você não passa isso como um argumento para o seu roteiro?

your_scritp $COLUMNS

while (( $# ))
do
    echo -n "-"
    shift
done
echo

EDIT: Depois de ler a resposta de Jason, eu verifiquei o valor COLUMS (é um valor único), e no meu caso visto é 80, então percebo que seu for loop está errado (meu script anterior era para uma variável multivalor, não é uma variável de valor único). Seu loop de quatro só será executado uma vez, se você quiser executar um loop for quatro vezes, você deve:

for i in 1 2 3 4
do
   your stuff here
done

Mas no seu caso, eu acho que o que você quer é algo como:

count=$1
while (( $count ))
do
    echo -n "-"
    count=$(($count-1))
done
    
por 13.07.2015 / 08:37
0

Então, parece que COLUMNS não está em env , então eu acho que o título deste tópico está incorreto, já que não é uma variável de ambiente?

   export COLUMNS
   echo $COLUMNS

Não funciona. No link que eu obtenho, export é disponibilizar algo do processo pai para um processo filho, que não é o que eu quero fazer. Não tenho certeza sobre o que foi essa sugestão, ou se estou interpretando mal o que estava sendo sugerido.

COLUMNS=$COLUMNS my_script

Resultados em:

   fork: retry: No child processes
   fork: Resource temporarily unavailable

E eu não trabalhei meu caminho pelo resto da sugestão "over the top", já que é tão claro quanto a lama.

   screen_width='stty size | cut -f2 -d " " -'

Está funcionando, no entanto. Mas isso só resolve o problema próximo, não o problema real, pois há mais coisas em set que eu poderia querer sair - e eu não sei os comandos para cada um deles (se eles têm comandos). Usando cut em vez de awk / sed / whatever, como eu gostaria de algo que seja o mais portátil possível (e não sei se stty é portátil, mas está funcionando agora, então eu ' estou cruzando meus dedos).

Eu sou usando um loop while, yeah, o loop for não funcionou do jeito que eu imaginava, e nenhum modificador seq / whatever em meu shell.

Eu realmente gostaria de saber por que preciso de parênteses duplos, mas preciso deles.

Este "vá e defina env no arquivo rc correspondente" , parece interessante, mas as instruções não são claras :) Suponho que isso significa que eu poderia adicionar variáveis específicas à lista que env puxa para cima?

    
por 13.07.2015 / 16:35
0

Você deve fazer:

COLUMNS=$COLUMNS my_script

Você também pode fazer algo como isso reescrever em sed :

 STTY=
 for fd in 0 1 2
 do      [ -t "$fd" ]    &&
         break
 done|| ${STTY:?Run "$0" on a terminal}
 STTY=$( stty -a <&"$fd" |
         sed     -Ee'/;/{s/^/;/' \
                 -e's/((; *[^ ;]* )[= ]*)?([^;])/\/g' \
                 -e's/; *([^ ;]+) ([^;]*)/\n=/g' \
                 -e's/;* *$//;t' -e\} \
                 -e'H;$!d;x;s/[[:space:]]+/,/g' \
                 -e's/^,*/FLAGS=/;s/,*$//')

Na minha máquina (neste terminal) que coloca o seguinte valor em $STTY :

speed=
COLUMNS=$COLUMNS my_script
 STTY=
 for fd in 0 1 2
 do      [ -t "$fd" ]    &&
         break
 done|| ${STTY:?Run "$0" on a terminal}
 STTY=$( stty -a <&"$fd" |
         sed     -Ee'/;/{s/^/;/' \
                 -e's/((; *[^ ;]* )[= ]*)?([^;])/\/g' \
                 -e's/; *([^ ;]+) ([^;]*)/\n=/g' \
                 -e's/;* *$//;t' -e\} \
                 -e'H;$!d;x;s/[[:space:]]+/,/g' \
                 -e's/^,*/FLAGS=/;s/,*$//')
\ \b\a\u\d rows= columns=
speed=%pre%%pre%\ \b\a\u\d
rows=
columns=%pre%
line=%pre%

intr=\^\C
quit=\^\
erase=\^\H
kill=\^\U
eof=\^\D
eol=\<\u\n\d\e\f\>

eol2=\<\u\n\d\e\f\>
swtch=\<\u\n\d\e\f\>
start=\^\Q
stop=\^\S
susp=\^\Z
rprnt=\^\R

werase=\^\W
lnext=\^\V
discard=\^\O
min=
time=%pre%
FLAGS=-parenb,-parodd,-cmspar,cs8,-hupcl,-cstopb,cread,-clocal,-crtscts,-ignbrk,-brkint,-ignpar,-parmrk,-inpck,-istrip,-inlcr,-igncr,icrnl,ixon,-ixoff,-iuclc,-ixany,-imaxbel,iutf8,opost,-olcuc,-ocrnl,onlcr,-onocr,-onlret,-ofill,-ofdel,nl0,cr0,tab0,bs0,vt0,ff0,isig,icanon,iexten,echo,echoe,echok,-echonl,-noflsh,-xcase,-tostop,-echoprt,echoctl,echoke,-extproc
line=%pre% intr=\^\C quit=\^\ erase=\^\H kill=\^\U eof=\^\D eol=\<\u\n\d\e\f\> eol2=\<\u\n\d\e\f\> swtch=\<\u\n\d\e\f\> start=\^\Q stop=\^\S susp=\^\Z rprnt=\^\R werase=\^\W lnext=\^\V discard=\^\O min= time=%pre% FLAGS=-parenb,-parodd,-cmspar,cs8,-hupcl,-cstopb,cread,-clocal,-crtscts,-ignbrk,-brkint,-ignpar,-parmrk,-inpck,-istrip,-inlcr,-igncr,icrnl,ixon,-ixoff,-iuclc,-ixany,-imaxbel,iutf8,opost,-olcuc,-ocrnl,onlcr,-onocr,-onlret,-ofill,-ofdel,nl0,cr0,tab0,bs0,vt0,ff0,isig,icanon,iexten,echo,echoe,echok,-echonl,-noflsh,-xcase,-tostop,-echoprt,echoctl,echoke,-extproc

... o que deve ser bastante seguro para eval , mas pode ser um pouco exagerado.

    
por 13.07.2015 / 09:43