带有命令行参数的别名/函数

带有命令行参数的别名/函数

我厌倦了输入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/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了解可用的 IP 地址),要么只需使用以下命令绑定到所有 IP 地址:

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

事情的 bash 方面是合理的。

答案3

你做得对。

我怀疑您在测试中遇到了网络问题,失败的测试使用该功能纯属巧合。当您关闭 TCP 连接时,端口会继续使用一小段时间(30 秒),以防有未收到的待处理数据包(数据包可能无序到达)。这是TIME_WAIT状态。为了允许新服务器立即重启,设置SO_REUSEADDR标志setsockoptPython 中有一个例子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";} <<<'

请注意,后面需要有空格{,前面需要有分号。}

相关内容