コマンドライン引数を持つエイリアス/関数

コマンドライン引数を持つエイリアス/関数

と入力するのは面倒な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 アドレス (システムの一部ではない IP アドレス) を入力したときに返されるエラーです。以下に、実際に実行した例を示します。

$ 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)、次のコマンドですべての IP アドレスにバインドする必要があります。

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

bash 側は健全です。

答え3

君は正しいことをしているよ。

テスト中にネットワークの問題に遭遇したのではないかと思います。失敗したテストでこの関数が使用されていたのは偶然です。TCP接続を閉じると、まだ受信されていない保留中のパケットがある場合に備えて、ポートはしばらく(30秒)使用されたままになります(パケットが順番どおりに到着しないことがあります)。これがTIME_WAIT新しいサーバーをすぐに再起動できるようにするには、SO_REUSEADDR旗を立てるsetsockopt(Pythonに例がありますsocketドキュメンテーション)。

答え4

{ list; }グループコマンドとhere-stringリダイレクトを使用してエイリアスを作成できます<<<。主な目的は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";} <<<'

後ろにスペース{、前にセミコロンが}必要であることに注意してください。

関連情報