如何在 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
设置默认值,以防用户不传递参数,留给另一个问题。
我正在使用 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
设置默认值,以防用户不传递参数,留给另一个问题。