2011-11-12 63 views
2

我編寫了一個腳本,它使用$ 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,用於在當前子調用完成後要執行的其他子調用,或者某種方式來了解管道被用在最後的命令中)?

+4

一個挑剔:'少(1)'實際上並沒有打開文件。 '貓(1)'呢。 '少(1)'有一個匿名管道的內容打開;管子由「管子(2)」構成。 – sarnold

+0

這是一個錯誤的想法,我非常懷疑你能夠從shell正確地實現它。你嘗試過'lsof'嗎? –

回答

0

我認爲你需要改變一下你的實現,並使用「歷史」命令來使它工作。另外,使用命令「別名」檢查所有配置的別名。命令「which」檢查命令是否實際存儲在任何PATH目錄中。祝你好運