如何将环境变量传递给脚本?

如何将环境变量传递给脚本?

好的,我可以从命令行显示环境变量:

echo $COLUMNS

并得到回应。

但我无法从 shell 脚本中执行它,我什么也得不到。因此,必须有一种方法来导入该环境变量 - 但我无法找到简单的解决方案/解释。

曾几何时,我记得看到过类似的东西$ENV_COLUMNS,但那是不正确的(或者遗漏了一些东西)。

我正在尝试这样的事情:

    for x in $COLUMNS
     do echo -n "-"
    done
    echo #to get the /n

答案1

你应该做:

COLUMNS=$COLUMNS my_script

您也可以在以下位置进行类似的重写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/((; *[^ ;]* )[= ]*)?([^;])/\2\\\3/g' \
                 -e's/; *([^ ;]+) ([^;]*)/\n\1=\2/g' \
                 -e's/;* *$//;t' -e\} \
                 -e'H;$!d;x;s/[[:space:]]+/,/g' \
                 -e's/^,*/FLAGS=/;s/,*$//')

在我的机器上(在此终端上)将以下值放入$STTY

speed=\3\8\4\0\0\ \b\a\u\d
rows=\4\3
columns=\1\0\9
line=\0

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=\1
time=\0
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

...这对于 来说应该很安全eval,但可能有点过头了。

答案2

你可能会尝试

export COLUMNS

以获得解释。

但你应该告诉我们这个脚本是如何调用的。如果是由某个 crontab 启动的,很可能是在没有COLUMNS.您可能会用来printenv 检查。

答案3

这是您上一个问题的后续问题,我们正在了解您想要做什么。我很确定其他人对此有自己的风格,但这也许可以帮助您入门。

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

该回声不是您想要做的,只是为了证明我们已将该值放在易于访问的地方。

答案4

所以,看起来COLUMNS不在 中env,所以我猜这个线程的标题不正确,因为它是不是环境变量?

   export COLUMNS
   echo $COLUMNS

不起作用。从我收集的链接来看export,是让某些东西从父进程到子进程可用,这不是我想要做的。不确定该建议的内容,或者我是否误读/误解了建议的内容。

COLUMNS=$COLUMNS my_script

结果是:

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

我还没有完成这个“过分”建议的其余部分,因为它就像泥浆一样清晰。

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

然而,工作。但这只能解决最近的问题,而不是实际的问题,因为我可能想摆脱更多的东西set- 而且我不知道每个东西的命令(如果它们有命令)。使用cut而不是awk/ sed/ 任何东西,因为我想要尽可能便携的东西(我不知道是否stty便携,但它现在正在工作,所以我祈祷)。

使用 while 循环,是的,for 循环没有按照我想象的方式工作,并且seq我的 shell 中没有修饰符/任何内容。

我真的很想知道为什么我需要双括号,但我确实需要它们。

“在相应的rc文件中设置env”,听起来很有趣,但方向不清楚:)我猜这意味着我可以将特定的变量添加到env拉出的列表中?

相关内容