我想解析一個命令行參數列表(包含在特殊的"[email protected]"
Bash變量中),該列表將被傳遞給Linux ls
二進制文件。從Bash中的參數列表中提取參數列表的位置路徑參數
的參數可以任選地包含關鍵字參數像-h
或--color
或--hide 'pattern'
,並且它們可以任選地包含一個目錄或文件路徑(絕對/home
,相對./bin
或隱式地相對Documents
)在任何位置。
有沒有辦法從列表中只提取位置路徑參數,如果有任何被包含?
如果無法合理排除所有邊緣情況,我們至少可以實現目標,並在路線參數作爲最後一個參數提取時抽取路徑參數?
在情況下,它可以幫助爲背景下,我要與awk
進一步處理路徑參數在下一步驟由(以"show git branch in ls -l
" on Ask Ubuntu相)附加進一步的信息以每行修改的ls -alF
輸出。在這裏,我有問題,如果我運行例如ls -alF /home
,我在輸出中輸入了關於./
和../
的條目,然後awk
將作爲到當前工作目錄的相對路徑處理,而不是處理到指定的/home
。
實際腳本(Bash函數)可以在Ask Ubuntu上面的鏈接答案中找到。下面是跳過調用外部git
命令,並分析其輸出的最小版本:
lg(){
ls -alF "[email protected]" |
awk '{
# Split into columns 1-8 and 9+ (file name):
match($0, /^(\S+\s+){8}(.+)$/, f);
# do something with the file name using an external command
# result is stored in b, e.g. "(master)" or an empty string
b=f[2];
print $0, b
}'
; }
示例輸出(包括外部調用原有功能):
$ lg
total 48
drwxrwxr-x 12 bytecommander bytecommander 4096 Aug 26 14:48 ./
drwxr-xr-x 74 bytecommander bytecommander 4096 Aug 26 15:30 ../
drwxrwxr-x 6 bytecommander bytecommander 4096 Aug 26 14:43 git1/ (master)
drwxrwxr-x 7 bytecommander bytecommander 4096 Aug 26 14:42 git2/ (develop)
drwxrwxr-x 4 bytecommander bytecommander 4096 Aug 26 14:45 no-git/
-rw-rw-r-- 1 bytecommander bytecommander 0 Aug 26 14:42 regular-file
現在,如果我的當前工作目錄是例如git1
(這是一個存儲庫),我運行它,如lg /home
,ls
輸出中的./
條目將正確對應於/home
,但我添加的存儲庫信息錯誤地是當前工作目錄中的一個,即git1
。父目錄條目相同../
什麼是你真正想幹什麼?處理'ls'的輸出是一個好主意。 – chepner
@chepner我認爲我最後的目標在最後一段中有很好的描述。我想要實現的是將ls -alF的輸出保持原樣並通過將一些git元信息附加到輸出中列出的所有目錄來擴展它。我有一個工作解決方案(見鏈接),目前存在的問題是'.' /'..'條目相對於工作目錄而不是可選的指定位置參數。是的,我知道解析'ls'並不是最好的選擇,但另一種方法是重寫'ls',我想這樣做更少。 –
你也許試圖寫一個這就是所謂的像腳本'的MyScript -alF/home'和內部調用'LS「$ @」'你要那麼也是腳本中調用'的awk「...」/home'?如果這樣awk調用就會是'awk'...'「$ {」#}「'在bash中 - 這就是你想要的嗎?如果不是,則用一個具體的示例腳本和樣本輸入預期輸出來澄清你的問題,即a [mcve]。 –