![](/img/trans.png)
[英]bash: How do I identify the filename argument among arguments passed from the command line?
[英]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.