簡體   English   中英

如何在 bash 命令之前添加自動前綴([prefix] docker exec)

[英]How to add automatic prefix before bash command ([prefix] docker exec)

我想問是否有辦法在某些命令之前添加前綴。 關於 SO 的大多數類似問題都涉及在命令的 output 中添加前綴,而不是在命令執行本身中添加前綴,所以這是我的示例:
I need to connect to docker container, I'm working on Windows and use ConEmu with bash terminal so I need to use winpty prefix to be able to connect to unix terminal of the container as follows:

docker exec -it my_container bash 

結果是:

unable to setup input stream: unable to set IO streams as raw terminal: The handle is invalid.

所以我需要使用:

winpty docker exec -it my_container bash

root@0991eb946acc:/var/www/my_container#

不幸的是,如果我從乞求的 winpty 添加,我的自動完成不起作用,所以我需要首先編寫 docker 命令,然后跳轉到命令的開頭輸入 winpty。 我想讓 bash 自動檢測每當我運行“docker exec”在它之前添加 winpty 前綴。 如何做到這一點? 我知道我可以為

alias de='winpty docker exec'

但我寧願繼續使用正常的 docker 命令流來自動完成。

編寫一個包裝 docker 的docker 如果它是docker exec命令調用winpty ,否則使用command回退到底層docker二進制文件。

docker() {
    if [[ ${1:-} == exec ]]; then
        (set -x; winpty docker "$@")
    else
        command docker "$@"
    fi
}

我把set -x放在那里,這樣它就會在調用winpty時打印出來,這樣就沒有隱藏的魔法。 當我的 shell 做鬼鬼祟祟的事情時,我喜歡被提醒。

$ docker exec -it my_container bash
+ winpty docker exec -it my_container bash
root@0991eb946acc:/var/www/my_container#

I'm not familiar with winpty but I expect winpty docker will call the docker binary and not this shell function. 但是,如果我錯了,你就會遇到麻煩,因為 function 會在一個無限的遞歸循環中一遍又一遍地調用自己。 哎呀! 如果發生這種情況,您可以使用which來確保它調用二進制文件。

docker() {
    if [[ ${1:-} == exec ]]; then
        (set -x; winpty "$(which docker)" "$@")
    else
        command docker "$@"
    fi
}

如果您想知道 shell 語法:

  • ${1}是函數的第一個參數。
  • ${1:-}確保您在啟用set -u以檢測未設置變量的情況下不會收到“未綁定變量”錯誤。
  • "$@"是所有函數的 arguments 的數組。

暫無
暫無

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

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