[英]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.