我正在使用cat
通过shell脚本创建新文件。它看起来像:
./script.sh > output.txt
如何在脚本中访问output.txt
作为变量。我已经尝试了$1
,但这不起作用。
脚本类似于:
#!/bin/sh
cat << EOF
echo "stuff"
EOF
由于没有一个os-agnostic方法来执行此操作,有没有办法将输出作为参数传递给脚本,然后将cat结果保存到脚本内的文件中?
因此命令看起来像:./script.sh output.txt
,我可以以$ 1的形式访问输出。这样的事情可能吗?
答案 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
如果用户未传递参数,则设置默认值将留给另一个问题。