好的,我可以从命令行显示环境变量:
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
拉出的列表中?