alias/función con argumentos de línea de comando

alias/función con argumentos de línea de comando

Estoy cansado de escribir manage.py startserver 10.211.55.4:4000, así que decidí crear un alias para eso. Lo único es que el puerto cambia a veces. Entonces hice esto en el perfil de bash:

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

Pero luego, cuando lo llamo:, runserver 3000lo inicia, pero inmediatamente deja de decir:

"Error: no se puede asignar esa dirección IP". Sin embargo, si escribo lo mismo directamente en la línea de comando, funciona sin quejas.

Respuesta1

Siguiendo la línea de su intento original, puede ajustar esa función a lo siguiente:

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

y luego llámalo así:

PORT=3000 runserver

Respuesta2

En realidad, este es un error que recibe de Python/Django cuando le proporciona una dirección IP a la que no puede vincularse (una que no es parte del sistema), como se muestra en un ejemplo real recién ejecutado a continuación:

$ 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.

Por lo tanto, necesita corregir su dirección IP (consulte el resultado de ifconfig --allpara ver qué hay disponible) o simplemente vincularlas a todas con:

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

El lado bash de las cosas es sólido.

Respuesta3

Lo estás haciendo bien.

Sospecho que se está topando con un problema de red en sus pruebas, y el hecho de que la prueba fallida haya utilizado la función fue una coincidencia. Cuando cierras una conexión TCP, el puerto permanece en uso por un pequeño período de tiempo (30 segundos), en caso de que hubiera paquetes pendientes que aún no se hayan recibido (los paquetes pueden llegar desordenados). Este es elTIME_WAITestado. Para permitir que un nuevo servidor se reinicie inmediatamente,establecer la SO_REUSEADDRbanderacon setsockopt(hay un ejemplo en Pythonsocketdocumentación).

Respuesta4

Podemos crear un alias con el comando de grupo { list; }y la redirección de cadenas aquí <<<. El objetivo clave es redirigir stdinal comando. Hay un par de formas que se presentan a continuación.

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";} <<<'

Tenga en cuenta que se requieren el espacio después {y el punto y coma antes }.

información relacionada