在Bash脚本中获取输出文件名

时间:2014-09-02 12:09:33

标签: bash

我想获得我传递给我的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

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

2 个答案:

答案 0 :(得分:4)

试试这个:

 #!/bin/bash

 output=$(readlink /proc/$$/fd/1)
 echo "output is performed to \"$output\""

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

啊哈,FreeBSD不久前废弃了procfs,现在有一个名为procstat的不同设施。您可以从以下screenshot了解如何提取所需信息。我想有些awk-ing是必需的:)

答案 1 :(得分:3)

找出在文件描述符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