【问题标题】:UNIX Shell script - Saving input file nameUNIX Shell 脚本 - 保存输入文件名
【发布时间】:2013-03-13 21:37:43
【问题描述】:

假设我想按如下方式运行一个 shell 脚本:

./script.sh < in.txt > out.txt

如何解析stdin重定向到的文件名,本例中为“in.txt”?

我知道如果我有:

./script.sh in.txt out.txt

我可以在脚本文件中使用以下内容来获取“in.txt”

eval var1="$1"

但我无法弄清楚输入重定向。 谢谢!

【问题讨论】:

  • 澄清一下,给定一个外部重定向的标准输入/标准输出,你想要相应的文件吗?您想要 Linux 特定的解决方案吗?

标签: unix filenames io-redirection


【解决方案1】:

这不是一个可移植的解决方案,但它适用于某些系统(当输入流是常规文件时):

#!/bin/sh
echo Input file: $( readlink -f /proc/$$/fd/0 )

【讨论】:

    【解决方案2】:

    首先你不需要“评估”任何东西:

    var1="$1"
    

    够了。

    第二:你不能,除非你对“/dev/stdin”、“/proc/self/fd/0”或你的操作系统提供的任何东西感到满意;参见例如http://plan9.bell-labs.com/sys/doc/lexnames.html -- plan9 需要添加 fd2path(),因为(惊喜,惊喜)它以前不存在。

    【讨论】:

    • 您的第一和第二分别处理问题的第二和第一部分:D 但是您的观点是有效的。并非所有文件都有名称。想想管道 I/O:command1 ... | command2 ...。管道并没有真正的名称(除了/proc 中的条目)。
    【解决方案3】:

    只要做:

    #!/bin/sh
    infile=$1
    outfile=$2
    
    cat < $1
    echo > $2
    

    或者如果你想变得更花哨,你可以改变标准输入和标准输出:

    #!/bin/sh
    1<$1
    1>$2
    echo "test"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      相关资源
      最近更新 更多