在Bash Script中获取输出文件名



我只想获得我传递给bash脚本的输出文件的文件名(带扩展名):

a=$1
b=$(basename -- "$a")
echo $b #for debug
if [ "$b" == "test" ]; then
    echo $b
fi

如果我输入:

./test.sh /home/oscarchase/test.sh > /home/oscarchase/test.txt

我想得到:

test.txt

在我的输出文件中,但我得到:

test.sh

如何解析第一个参数以获得正确的名称?

试试这个:

 #!/bin/bash
 output=$(readlink /proc/$$/fd/1)
 echo "output is performed to "$output""

但请记住,此解决方案依赖于系统(尤其是Linux)。我不确定/proc文件系统在例如FreeBSD中是否具有相同的结构,当然这个脚本在bash for Windows中也不起作用。

啊哈,FreeBSD不久前就废弃了procfs,现在有了一个名为procstat的不同功能。您可能会从下面的屏幕截图中了解如何提取所需信息。我想需要一些调整:)

查找在文件描述符1(标准输出)上打开的文件的名称不能直接在bash中执行;这取决于您使用的操作系统。您可以使用lsofawk来执行此操作;它不依赖于proc文件系统,尽管确切的调用可能有所不同,但该命令适用于Linux和Mac OS X,因此它至少在一定程度上是可移植的。

output=$( lsof -p $$ -a -d 1 -F n | awk '/^n/ {print substr($1, 2)}' )

一些解释:

  • -p $$为当前进程选择打开的文件
  • -d 1仅选择文件描述符1
  • -a用于要求同时应用-p-d(默认情况下显示所有符合任一条件的文件
  • -F n修改输出,使每个字段得到一行,前缀为标识符字符。这样,您将得到两行:一行以p开头,表示进程ID,另一行以`n开头,表示文件的文件名
  • awk命令简单地选择以n开始的行,并输出第一个字段减去初始n

最新更新