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

Linux 如何在bash脚本中获取cat输出路径作为变量,linux,bash,shell,cat,Linux,Bash,Shell,Cat,我正在使用cat通过shell脚本创建一个新文件。它看起来像: ./script.sh>output.txt 如何在脚本中作为变量访问output.txt。我试过1美元,但没用 脚本看起来像: #!/bin/sh cat << EOF echo "stuff" EOF 既然没有一种与操作系统无关的方法可以做到这一点,那么有没有一种方法可以将输出作为参数传递到脚本中,然后将cat结果保存到脚本中的一个文件中 因此,命令看起来像:./script.sh output.txt,我可以

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

./script.sh>output.txt

如何在脚本中作为变量访问output.txt。我试过1美元,但没用

脚本看起来像:

#!/bin/sh

cat  << EOF
echo "stuff"
EOF
既然没有一种与操作系统无关的方法可以做到这一点,那么有没有一种方法可以将输出作为参数传递到脚本中,然后将cat结果保存到脚本中的一个文件中

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

字面上的问题:确定Stdout被重定向到何处 当用户运行时:

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

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

output_dest=$(readlink -f /dev/fd/1)

echo "My output is being written to $output_dest"
这实际上是询问您的第一个文件描述符(stdout)在哪里打开。请注意,结果并不总是有用的——例如,如果您的程序正在通过管道传输到其他程序中,它可能类似于[pipe:12345]

如果您关心可移植性或健壮性,您通常应该以这样一种方式编写您的软件,即它不需要知道或关心其标准输出的方向

最佳实践:自己重定向脚本的Stdout 如果需要脚本可以访问的输出文件名,更好的做法是将其作为显式参数接受:

#!/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
./yourscript outfile
…然后指示用户将文件名作为参数传递:

#!/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
./yourscript outfile
字面上的问题:确定Stdout被重定向到哪里 当用户运行时:

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

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

output_dest=$(readlink -f /dev/fd/1)

echo "My output is being written to $output_dest"
这实际上是询问您的第一个文件描述符(stdout)在哪里打开。请注意,结果并不总是有用的——例如,如果您的程序正在通过管道传输到其他程序中,它可能类似于[pipe:12345]

如果您关心可移植性或健壮性,您通常应该以这样一种方式编写您的软件,即它不需要知道或关心其标准输出的方向

最佳实践:自己重定向脚本的Stdout 如果需要脚本可以访问的输出文件名,更好的做法是将其作为显式参数接受:

#!/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
./yourscript outfile
…然后指示用户将文件名作为参数传递:

#!/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
./yourscript outfile
写入文件output.txt

如果用户未传递参数,则设置默认值将留待其他问题处理

写入文件output.txt


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

能否以完全与操作系统无关的方式显示脚本.sh的代码?您不能。有Linuxims,但它们是Linuxims。发布了脚本的基本知识如果运行./script.sh output.txt,则output.txt自动为$1。在这一点上,问题是什么?对于脚本的其余部分,是如何使输出转到该文件的?将exec>1美元放在顶部。顺便说一句/bin/sh不是bash-它们是两个不同的shell,彼此不兼容bash甚至不是一个合适的超集-它的echo与POSIX sh标准微妙地不兼容,POSIX sh标准不允许echo-e做任何事情,只允许将-e作为文本打印在标准输出上。如果您使用的是shebang,那么您应该使用sh标记,而不是bash标记。您可以显示script.sh的代码吗?以完全与操作系统无关的方式,您不能。有Linuxims,但它们是Linuxims。发布了脚本的基本知识如果运行./script.sh output.txt,则output.txt自动为$1。在这一点上,问题是什么?对于脚本的其余部分,是如何使输出转到该文件的?将exec>1美元放在顶部。顺便说一句/bin/sh不是bash-它们是两个不同的shell,彼此不兼容bash甚至不是一个合适的超集-它的echo与POSIX sh标准微妙地不兼容,POSIX sh标准不允许echo-e做任何事情,只允许将-e作为文本打印在标准输出上。如果您使用的是shebang,那么应该使用sh标记,而不是bash标记。在这种情况下,cat>$outfile?>>$outfile,引号很重要。顺便问一下,为什么不使用>>$1…?@GeorgeVasiliou:这只是一种习惯,它可以在较长的脚本中使用。cat>$outfile?>$outfile,在那种c中
ase-引用很重要。顺便问一下,为什么不干脆>>$1…?@geogevasiliou:这只是一个习惯,用较长的脚本是值得的。