Bash脚本尾部和导出行为不端

时间:2014-05-13 06:25:55

标签: bash shell variables export tail

罗!我有一个家庭作业,我必须在参数中给出任何目录或文件,并有以下限制:我必须将整个列表发送到stdout 然后我必须将最后5行拖到stderr上,最后我必须得到最后一行 到一个名为LIST的变量中,它必须被导出。 这是我的代码:

#!/bin/bash
TMP="tmp"
echo "" > $TMP
ls -l $@ >>$TMP
cat $TMP
tail -n5 $TMP 1>&2
export LIST=$(tail -n1 $TMP)

当然它不起作用,我不知道我哪里出错了:[有什么建议吗?

1 个答案:

答案 0 :(得分:0)

如果以这种方式运行脚本:

$ ./script.sh

然后它会运行新的/bin/bashLIST变量将导出到它的env。

如果你这样运行:

$ . script.sh

这是:

的快捷方式
$ source script.sh

然后它将从当前运行的shell中的脚本执行命令,LIST var将被导出到它的env,因此您以后可以使用它。

你的脚本运行正常(它可以大大改进,但它对于一个简单的家庭作业来说已经足够了)但是它会将LIST导出到一个新的shell,它会在脚本完成时结束。

所有这一切的原因是子进程无法修改它的父env。另一种使其工作的方法是在脚本结束时再执行一次bash(最后添加/bin/bash)。然后你最终将继承LIST形式的父(脚本)

如果您希望改进脚本而不是:

#!/bin/bash
TMP="tmp"              # use `mktemp` for that and `trap` to clean it even if the script will be interrupted
echo "" > $TMP         # `> $TMP` is enough to create an empty file. Another way is `touch`
ls -l $@ >>$TMP        # check Bash pitfalls webpage
cat $TMP               # you can use `tee` at the begging
tail -n5 $TMP 1>&2     # you can ommit 1 here
export LIST=$(tail -n1 $TMP)