我想获得我传递给我的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
我如何进行解析第一个参数以获得正确的名称?
答案 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
中执行的操作;这取决于您使用的操作系统。您可以使用lsof
和awk
来执行此操作;它并不依赖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
。