罗!我有一个家庭作业,我必须在参数中给出任何目录或文件,并有以下限制:我必须将整个列表发送到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)
当然它不起作用,我不知道我哪里出错了:[有什么建议吗?
答案 0 :(得分:0)
如果以这种方式运行脚本:
$ ./script.sh
然后它会运行新的/bin/bash
,LIST
变量将导出到它的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)