Command-Line

操作終端輸入

  • July 28, 2017

有沒有辦法在終端輸入被執行之前操縱它?例子:

apt-get update在終端中輸入。現在我想將其更改為sudo apt-get update在執行之前。

我嘗試了什麼:

我考慮過執行一個腳本的可能性,然後該腳本將使用操縱的輸入執行輸入的命令,但是我沒有找到一種方法來執行該腳本,而應該執行另一個程序。

我感謝每一個答案。我在 Linux Mint Serena 上。

澄清:

每當呼叫命令時,都應該有一個腳本或任何在後台執行的腳本,並檢查它是否與模式匹配。如果不是,則執行輸入,如果是,則操作該命令並執行->這就是我的範例apt-get updateto的原因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 _1that cd ~/Desktop,您可以執行以下操作:

set -o cdable_vars
_1=~/Desktop

就個人而言,我不太喜歡 shell 像那樣在我背後做事(尤其是其他人至少不會想到的事)的想法。

引用自:https://unix.stackexchange.com/questions/382331