簡體   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