Command-Line
操作終端輸入
有沒有辦法在終端輸入被執行之前操縱它?例子:
apt-get update
在終端中輸入。現在我想將其更改為sudo apt-get update
在執行之前。我嘗試了什麼:
我考慮過執行一個腳本的可能性,然後該腳本將使用操縱的輸入執行輸入的命令,但是我沒有找到一種方法來執行該腳本,而應該執行另一個程序。
我感謝每一個答案。我在 Linux Mint Serena 上。
澄清:
每當呼叫命令時,都應該有一個腳本或任何在後台執行的腳本,並檢查它是否與模式匹配。如果不是,則執行輸入,如果是,則操作該命令並執行->這就是我的範例
apt-get update
to的原因sudo apt-get update
。我唯一能弄清楚的是,該腳本在執行之前如何獲取該命令。可能的目的:
- 嘗試訪問特定文件/目錄時,請輸入密碼提示
- 創建快捷方式(
cd _1
將更改為cd ~/Desktop
)
呃,一些全新的東西(對我來說):閱讀使用 PS4 的答案:如何攔截每個命令
如果只是測試:
bash: PS4='$(echo $(date) $(history 1) >> /tmp/trace.txt) TRACE: ' bash: set -x bash: date TRACE: date Fr 28. Jul 14:13:24 CEST 2017
如上面的答案所述, PS4 … 對正在執行的每個命令進行評估 …。因此,如果您將其替換為通過包裝器傳遞您的任何命令並驗證執行,那麼您可以攔截您的任何命令。
在
zsh
中,您可以添加一些檢查器:validate_apt-get_update() { local match MATCH MBEGIN MEND mbegin mend if [[ $BUFFER =~ '^(\s*)(apt-get\s+update.*)' ]]; then LBUFFER="$match[1]sudo " RBUFFER=$match[2] zle -M 'WARNING: sudo has been added before apt-get update' return 1 fi } accept-line() { validate_apt-get_update && zle .accept-line } zle -N accept-line
它將插入
sudo
,將游標定位在它之後,如果您輸入的前兩個單詞是apt-get
並更新的行,則會給您一條警告消息並且不接受該行,讓您有機會檢查它是否真的是您想要的。在這裡,我們正在對 shell 命令行進行自己的簡化解析。如果您輸入以下內容,它將不起作用:
'apt-get' update "$(echo apt-get)" update something else; apt-get update...
這也可能是一樣的,因為這可以讓你這樣做:
\apt-get update
如果您想繞過該檢查,就像您想繞過別名一樣。
對於您的
cd _1
thatcd ~/Desktop
,您可以執行以下操作:set -o cdable_vars _1=~/Desktop
就個人而言,我不太喜歡 shell 像那樣在我背後做事(尤其是其他人至少不會想到的事)的想法。