如何在KSH或Bash中获取作为命令行参数传入的文件的名称?

时间:2014-05-23 17:53:06

标签: bash ksh

例如:如果我有

$ readFile.sh < info

如何获取脚本:

echo "Reading the contents of $1!"

给我这个文件的名字?我是以完全错误的方式解决这个问题吗?

我是ksh和shell脚本的新手,我不知道如何谷歌这个。

3 个答案:

答案 0 :(得分:3)

由于您使用的是输入重定向,因此无法轻松获取正在读取标准输入的文件的名称。 (一般情况下,甚至可能没有文件,因为标准输入可能来自另一个命令的标准输出。)

如果您将脚本称为

readFile.sh info

然后$1确实会扩展为参数的名称info


我在第一段中说“轻松”,因为技术上可能(以平台相关的方式)找出用于标准输入的文件描述符后面的文件名。但是当你需要这些信息时,它表明你的脚本应该采用文件名参数,而不是从标准输入读取。

答案 1 :(得分:2)

(在支持procfs的系统上)为了获取脚本正在读取的名称(假设您正在读取文件,即bash scriptname < somefile

readlink -f /proc/$$/fd/0

如果输入来自STDIN,则无法使用。

答案 2 :(得分:1)

没有可移植的方法来获取该文件名。

您的标准输入可能根本不是文件;它可能是一个管道。

该文件可能已取消链接,因此文件系统中不再有任何名称。

如果您想以非移植方式执行此操作,并且系统具有lsof命令,则可以执行此操作:

filename="$(lsof -F -p $$ -a -d 0 | grep ^n | sed 's/^n//')"

如果您使用的是Linux,则可以readlink使用/proc/self/fd/0(请参阅devnull的答案)。

否则,重写脚本以将文件名作为其第一个参数(参见chepner的答案)。