
我試圖弄清楚如何向從終端運行的命令添加新的運行時標誌。
例如。 :我最近開始嘗試使用 Docker,發現透過複製貼上 ID 來清理退出的容器很乏味。我想clean
在docker
運行時添加一個命令行選項,這樣當我運行時docker clean
(或者也許docker --clean
我們要那樣做),我可以在內部將其映射為使用 docker 運行時已支援的選項來運行清理命令(即docker rm $(docker ps -a -q -f status=exited)
)有可能建立這樣的映射嗎?
我知道一種選擇是使用別名,但據我所知,別名不允許在別名中包含空格/命令列標誌。同樣,shell 函數也沒有幫助,因為它們覆蓋了整個功能(或者也許我做錯了)。我想探索這種可能性有一段時間了,所以任何幫助將不勝感激。
答案1
您可以定義一個與可執行檔同名的 bash 函數,讓它處理您的附加參數並使用command
內建函數明確呼叫原始函數。從man bash
:
command [-pVv] command [arg ...]
Run command with args suppressing the normal shell function
lookup. Only builtin commands or commands found in the PATH are
executed.
為了顯示,
function ls() {
case "$1" in
"foo") shift
echo "do new thing with remaining args: $@"
;;
*) command ls "$@"
;;
esac
}
然後
$ ls -ltr --color=always
total 12
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:16 subdir1
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:17 subdir2
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:17 subdir3
正常工作,而
$ ls foo -ltr --color=always
do new thing with remaining args: -ltr --color=always
(您可能需要unalias
該ls
命令才能嘗試此操作)。
顯然,現實世界的實作應該進行適當的錯誤檢查 - 也許使用getopts
來處理整個命令列而不是簡單的 switch/case $1
。
或者(更傳統地)您可以透過編寫一個來實現相同的目的包裝腳本並將其放置在比原始可執行檔更早的位置$PATH
(例如/usr/local/bin
或$HOME/bin
)。在包裝器中,透過其絕對路徑引用原始可執行檔。