簡體   English   中英

Bash(或其他shell):使用函數/腳本包裝所有命令

[英]Bash (or other shell): wrap all commands with function/script

編輯:這個問題最初是特定於bash的。 我仍然希望有一個bash解決方案,但是如果有在另一個shell中執行此操作的好方法,那么這也將非常有用!

好的,問題的頂層描述。 我希望能夠向bash添加一個鈎子,這樣,當用戶輸入時,例如$cat foo | sort -n | less $cat foo | sort -n | less $cat foo | sort -n | less ,將其攔截並翻譯為wrapper 'cat foo | sort -n | less' wrapper 'cat foo | sort -n | less' wrapper 'cat foo | sort -n | less' 我已經看到了在每個命令之前和之后運行命令的方式(使用DEBUG陷阱或PROMPT_COMMAND或類似的命令),但是沒有關於如何攔截每個命令並使它由另一個進程處理的任何知識。 有沒有辦法做到這一點?

為了解釋為什么我要這樣做,以防萬一人們對處理方法有其他建議:

腳本之類的工具使您可以將在終端中執行的所有操作記錄到日志中(某種程度上,bash歷史記錄也是如此)。 但是,它們做得不太好-腳本將輸入和輸出混合成一個大字符串,並與諸如vi的應用程序混淆,這些應用程序接管了屏幕,歷史記錄僅提供您鍵入的原始命令,而它們都不起作用如果您同時將命令輸入到多個終端,則效果很好。 我想做的是捕獲更豐富的信息-例如,命令,執行時間,完成時間,退出狀態,stdin和stdout的前幾行。 我還希望將其發送到某個地方的偵聽守護進程,該守護進程可以愉快地復用多個終端。 執行此操作的簡單方法是將命令傳遞給另一個程序,該程序可以執行shell將命令作為子進程處理,同時獲取對stdin,stdout,exit status等的句柄。可以編寫一個Shell來執行此操作,但是您d失去了bash中已經存在的許多功能,這很煩人。

這樣做的動機來自於試圖對探索性數據分析(例如事后處理)進行有意義的理解。 有了這樣的更豐富的信息,就有可能生成關於所發生事件的體面報告,將一個命令的多次調用壓縮為一個命令,其中前幾個命令給出非零的退出,通過搜索與文件相關的所有內容來查詢文件來自何處,等等等

運行以下bash腳本:

#!/bin/bash
while read -e line
do
    wrapper "$line"
done

wrapper最簡單的形式可以由eval "$LINE" 您提到要有時間,所以也許要有time eval "$line" 您想捕獲退出狀態,因此應該在該行之后加上save=$? 而且,您想捕獲標准輸出的前幾行,因此需要進行一些重定向。 等等。

更多:Jo So建議包括對多行bash命令的處理。 以最簡單的形式,如果eval返回“語法錯誤:文件意外結束”,那么您要在繼續之前提示輸入另一行。 更好的是,要檢查bash命令是否正確,請在執行eval之前運行bash -n <<<"$line" 如果bash -n報告行尾錯誤,則提示輸入更多信息以添加到$ line中。 等等。

想到了Binfmt_misc。 Linux內核具有允許識別任意可執行文件格式並將其傳遞給用戶應用程序的功能。

您可以使用此功能來注冊包裝器,但是它應該處理所有可執行文件,而不是處理任意可執行文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM