Utilizo Bash como mi shell interactivo y me preguntaba si había una manera fácil de hacer que Bash ejecutara un comando del sistema en lugar de un comando incorporado del shell en el caso en que ambos compartan el mismo nombre.
Por ejemplo, use el sistema kill
(desde util-linux
) para imprimir la identificación del proceso (pid) de los procesos nombrados en lugar de enviar una señal:
$ /bin/kill -p httpd
2617
...
Sin especificar la ruta completa del comando del sistema, se utiliza el Bash incorporado en lugar del comando del sistema. El kill
incorporado no tiene la -p
opción, por lo que el comando falla:
$ kill -p httpd
bash: kill: p: invalid signal specification
Intenté las respuestas enumeradas en Hacer que bash use el comando externo `time` en lugar del shell incorporado, pero la mayoría de ellas solo funcionan porque en time
realidad es una palabra clave de shell , no un shell incorporado. .
Además de deshabilitar temporalmente el Bash incorporado enable -n kill
, la mejor solución que he visto hasta ahora es usar:
$(which kill) -p httpd
¿Hay otras formas más fáciles (implican menos escribir) de ejecutar un comando externo en lugar de un shell incorporado?
Tenga en cuenta que kill
es solo un ejemplo y me gustaría una solución generalizada similar a la forma en que el prefijo con el command
incorporado evita que se ejecuten funciones que tienen el mismo nombre que un comando externo. En la mayoría de los casos, generalmente prefiero usar la versión incorporada, ya que ahorra bifurcar un nuevo proceso y algunas veces la función incorporada tiene características que el comando externo no tiene.
fuente
which kill
en backticks (no puedo ponerlos en los comentarios) es un poco más corto.$(…)
: vea esto , esto y esto .Respuestas:
Asumiendo que
env
está en tu camino:env
ejecuta el archivo ejecutable nombrado por su primer argumento en un (posiblemente) entorno modificado; como tal, no conoce ni funciona con los comandos integrados de shell.Esto produce un poco de control de trabajo de shell, pero no se basa en un comando externo:
exec
requiere un ejecutable para reemplazar el shell actual, por lo que no utiliza ningún elemento integrado. El trabajo se ejecuta en segundo plano para que reemplace el shell de fondo bifurcado, no su shell actual.fuente
env
es claramente la respuesta correcta en mi humilde opinión.command -p cmd
invocando comando externozsh
, nobash
.(exec kill -p http)
hace que el trabajo reemplace un sub-shell en lugar de su shell actual y no tiene que lidiar con el control de trabajo cruft.env
tampoco sabe acerca de la construcción de conchas, ya que no es una concha. Obtendría el mismo efecto connice
o conxargs
cualquier otro programa como ese.La forma más simple de hacer lo que quieres podría ser poner la línea
en tu
~/.bashrc
archivo. Después de eso, cada nuevo inicio de sesión / invocación de bash interpretará "kill" como/bin/kill
.fuente
command
solución) en lugar de crear un alias separado para cada comando "sombreado". Ahora he editado mi pregunta para hacer esto más claro y más explícito. En la mayoría de los casos, generalmente prefiero usar la versión integrada, ya que los procesos pueden especificarse mediante ID de trabajo. Gracias de cualquier manera.Si conoce una solución que requiere algo de escritura y desea una solución que requiera menos escritura, compílela:
Abreviar cosas que normalmente requieren cierto esfuerzo es en lo que se destacan las computadoras.
fuente
En este caso muy específico, el comando
pgrep
es una coincidencia exacta para la necesidad.En un sentido general, una función funciona. Desde "comando de archivo":
llamar como
Pero si necesita escribir menos, no hay forma más corta que un buen alias.
Del concepto "list pid" (lp):
entonces, simplemente escriba:
fuente
(En zsh) Puede prefijar cualquier nombre de comando con un signo = para obtener la versión del sistema en lugar de una incorporada. Esta también es una forma práctica de esquivar cualquier alias que arruine un escenario específico.
fuente
zsh
cosa única. Lo uso regularmente, pero lo revisarébash
desde una computadora mañana.zsh
. Si bien etiqueté esta preguntabash
y la usé en el título, debe mantener esta respuesta ya que un usuario de zsh aún la encontraría útil.Puede enviar un informe de error contra su página de
kill
manual y preguntar por qué esto incluye opciones no estándar que se tomanpkill
y usanpkill
cada vez que desea obtener las funciones depkill.
Si llamas:
pkill httpd
evita los problemas que describe.
fuente