如何将cat输出路径作为bash脚本中的变量

时间:2018-03-09 18:34:23

标签: linux bash shell cat

我正在使用cat通过shell脚本创建新文件。它看起来像:

./script.sh > output.txt

如何在脚本中访问output.txt作为变量。我已经尝试了$1,但这不起作用。

脚本类似于:

#!/bin/sh

cat  << EOF
echo "stuff"
EOF

由于没有一个os-agnostic方法来执行此操作,有没有办法将输出作为参数传递给脚本,然后将cat结果保存到脚本内的文件中?

因此命令看起来像:./script.sh output.txt,我可以以$ 1的形式访问输出。这样的事情可能吗?

2 个答案:

答案 0 :(得分:5)

字面问题:确定您的标准被重定向到哪里

当用户运行时:

logs

...他们告诉他们的shell打开./yourscript >outfile 进行写入,并在启动脚本之前将其连接到脚本的标准输出。因此,在启动脚本时,文件名上的所有操作都已完成,因此名称不会直接传递给脚本。

在Linux(仅限)上,您可以通过procfs访问脚本启动之前重定向stdout的位置:

outfile

这是字面上的询问,你的第一个文件描述符(stdout)是开放的。请注意,结果并不总是有用 - 例如,如果您的程序被管道传输到其他内容,例如,它可能类似于output_dest=$(readlink -f /dev/fd/1) echo "My output is being written to $output_dest"

如果您关心可移植性或健壮性,通常应该以不需要知道或关注其stdout指示的位置的方式编写您的软件。

最佳实践:重定向脚本的标准

更好的做法,如果您需要脚本可以访问的输出文件名,则接受它作为显式参数:

[pipe: 12345]

...然后指示用户将文件名作为参数传递:

#!/bin/sh
#      ^^ note that that makes this a POSIX sh script, not a bash script

outfile=$1

exec >"$outfile"  # all commands below here have their output written to outfile

cat >>EOF
This is written to $outfile
EOF

答案 1 :(得分:1)

#!/bin/sh
outfile=$1
cat  << EOF > "$outfile"
echo "stuff"
EOF

./script.sh output.txt

您写入文件output.txt

如果用户未传递参数,则设置默认值将留给另一个问题。