例如:如果我有
$ readFile.sh < info
如何获取脚本:
echo "Reading the contents of $1!"
给我这个文件的名字?我是以完全错误的方式解决这个问题吗?
我是ksh和shell脚本的新手,我不知道如何谷歌这个。
答案 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的答案)。