我編寫了一個腳本,它使用$ BASH_COMMAND檢索當前運行的命令。該腳本基本上正在執行一些邏輯來確定爲每個tmux會話打開的當前命令和文件。除非用戶運行管道命令(例如cat file | less
),否則一切都很好,在這種情況下,$ BASH_COMMAND似乎只是將第一個命令存儲在管道之前。因此,腳本不會將命令顯示爲less[file]
(這是打開文件的實際程序),而是將其輸出爲cat[file]
。獲取包含管道的最後bash命令
我嘗試使用的一種替代方法是依靠history 1
而不是$ BASH_COMMAND。這種替代方法也有一些問題。首先,它不會自動擴展別名,就像$ BASH_COMMAND一樣,在某些情況下可能會導致腳本混淆(例如,如果我告訴它忽略ls
,但使用ll
代替(映射到ls -l
),腳本不會忽略命令,無論如何處理它),並且爲每個別名包含額外的條件似乎不是一個乾淨的解決方案。第二個問題是,我使用HISTIGNORE過濾掉了一些常見的命令,我仍然希望腳本知道,使用歷史記錄只會讓腳本忽略最後一個命令,除非它被歷史跟蹤。
我也嘗試使用${#PIPESTATUS[@]}
來查看數組長度是1(沒有管道)或更高(使用管道,在這種情況下我會檢索歷史),但它似乎總是隻知道1個命令爲好。
是否有人知道可以爲我工作的其他替代方案(例如另一個變量,它將存儲$ BASH_COMMAND,用於在當前子調用完成後要執行的其他子調用,或者某種方式來了解管道被用在最後的命令中)?
一個挑剔:'少(1)'實際上並沒有打開文件。 '貓(1)'呢。 '少(1)'有一個匿名管道的內容打開;管子由「管子(2)」構成。 – sarnold
這是一個錯誤的想法,我非常懷疑你能夠從shell正確地實現它。你嘗試過'lsof'嗎? –