繁体   English   中英

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

[英]How do I get the name of the file being passed in as a command line argument in KSH or Bash?

例如:如果我有

$ readFile.sh < info

如何获取脚本:

echo "Reading the contents of $1!"

给我文件的名字? 我会以完全错误的方式进行此操作吗?

我一般是不熟悉ksh和shell脚本的,我不知道该如何使用Google。

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

如果您将脚本称为

readFile.sh info

那么$1确实会扩展为参数info的名称。


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

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

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

如果输入来自STDIN则此方法不起作用。

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

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

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

如果您要非便携式地执行此操作,并且系统具有lsof命令,则可以执行以下操作:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM