代码之家  ›  专栏  ›  技术社区  ›  Kolby

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

  •  1
  • Kolby  · 技术社区  · 8 年前

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

    ./script.sh > output.txt

    如何访问 output.txt 作为脚本中的变量。我试过了 $1 但这行不通。

    脚本如下所示:

    #!/bin/sh
    
    cat  << EOF
    echo "stuff"
    EOF
    

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

    因此,命令如下所示: ./script.sh output.txt 我可以访问1美元的输出。这样的事情可能吗?

    2 回复  |  直到 8 年前
        1
  •  5
  •   Charles Duffy    8 年前

    字面上的问题:确定Stdout重定向到哪里

    用户运行时:

    ./yourscript >outfile
    

    。。。他们让他们的外壳打开 outfile 用于编写,并将其连接到脚本的标准输出, 之前 正在启动脚本。因此,当脚本启动时,文件名上的所有操作都已完成,因此名称不会直接传递给脚本。

    在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=$1
    
    exec >"$outfile"  # all commands below here have their output written to outfile
    
    cat >>EOF
    This is written to $outfile
    EOF
    

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

    ./yourscript outfile
    
        2
  •  1
  •   user unknown    8 年前
    #!/bin/sh
    outfile=$1
    cat  << EOF > "$outfile"
    echo "stuff"
    EOF
    

    具有

    ./script.sh output.txt
    

    写入文件输出。txt文件

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