псевдоним/функция с аргументами командной строки

псевдоним/функция с аргументами командной строки

Мне надоело печатать 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 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(есть пример в Pythonsocketдокументация).

решение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";} <<<'

Обратите внимание, что пробел после {и точка с запятой перед }ним обязательны.

Связанный контент