如何在 bash 脚本中获取 cat 输出路径作为变量

How to get cat output path as a variable in bash script

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

./script.sh > output.txt

如何在脚本中将 output.txt 作为变量访问。我已经尝试 </code> 但那不起作用。</p> <p>脚本类似于:</p> <pre><code>#!/bin/sh cat << EOF echo "stuff" EOF


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

所以命令看起来像:./script.sh output.txt 我可以访问 $1 的输出。 possible是这样的吗?

字面上的问题:确定你的标准输出被重定向到哪里

当用户运行时:

./yourscript >outfile

...他们告诉他们的 shell 打开 outfile 进行写入,并将其连接到脚本的标准输出,before 开始你的脚本。因此,当您的脚本启动时,对文件名的所有操作都已经完成,因此名称不会直接传递给脚本。

在 Linux(仅)上,您可以访问在通过 procfs 启动脚本之前将标准输出重定向到的位置:

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=

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

cat >>EOF
This is written to $outfile
EOF

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

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

./script.sh output.txt

你写入文件output.txt

设置默认值,以防用户不传递参数,留给另一个问题。