帶有命令列參數的別名/函數

帶有命令列參數的別名/函數

我厭倦了打字manage.py startserver 10.211.55.4:4000,所以我決定為此創建一個別名。唯一的問題是:連接埠有時會發生變化。所以我在 bash 設定檔中這樣做了:

function runserver() {
   python manage.py runserver 10.211.55.4:$1
}

但是當我調用它時:runserver 3000它啟動它,但立即停止說:

「錯誤:無法指派該 IP 位址」。但是,如果我直接在命令列中輸入相同的內容,它就可以毫無抱怨地工作。

答案1

按照您最初的嘗試,您可以將該函數調整為以下內容:

function runserver() {
    python manage.py runserver 10.211.55.4:$PORT
}

然後這樣稱呼它:

PORT=3000 runserver

答案2

這實際上是當你向 Python/Django 提供一個它無法綁定的 IP 位址(不屬於系統的一部分)時從 Python/Django 返回的錯誤,如下面的真實的、剛剛運行的範例所示:

$ python manage.py runserver 123.123.123.123:8000
Validating models...

0 errors found
June 03, 2014 - 22:36:58
Django version 1.5.7, using settings 'tv.settings'
Development server is running at http://123.123.123.123:8000/
Quit the server with CONTROL-C.
Error: That IP address can't be assigned-to.

因此,您要么需要修復您的 IP 位址(查看輸出ifconfig --all以了解可用的內容),要么只需使用以下命令綁定到所有這些位址:

function runserver() {
    python manage.py runserver 0:$1
}

bash 方面的事情是合理的。

答案3

你做對了。

我懷疑您在測試中遇到了網路問題,而失敗的測試使用該函數的事實純屬巧合。當您關閉 TCP 連線時,連接埠會在一小段時間(30 秒)內保持使用狀態,以防存在尚未收到的待處理封包(封包可能會亂序到達)。這是TIME_WAIT狀態。為了讓新伺服器立即重新啟動,設置SO_REUSEADDR標誌setsockopt(Python中有一個例子socket文件).

答案4

我們可以使用群組命令{ list; }和此處字串<<<重定向來建立別名。關鍵目標是重定向stdin到命令。下面介紹了幾種方法

alias runserver='{ xargs -I % python manage.py runserver 10.211.55.4:%;} <<<'

alias runserver='{ IFS= read -r port; python manage.py runserver 10.211.55.4:"$port";} <<<'

alias runserver='{ port=$(line); echo python manage.py runserver 10.211.55.4:"$port";} <<<'

請注意後面需要空格{,前面}需要分號。

相關內容