Usando alias con nohup
Pregunta
¿Por qué no funciona los siguientes?
$ alias sayHello='/bin/echo "Hello world!"'
$ sayHello
Hello world!
$ nohup sayHello
nohup: appending output to `nohup.out'
nohup: cannot run command `sayHello': No such file or directory
(La razón por la que hago esta pregunta es porque he alias mi perl
y python
a diferentes binarios de Perl/Python que estaban optimizados para mis propios fines; Sin embargo, Nohup me da problemas si no suministro un camino completo a mis binarios de Perl/Python)
Solución
Porque el shell no pasa alias a los procesos infantiles (excepto cuando usa $ () o ``).
$ alias sayhello = '/bin/echo "¡Hola mundo!"
Ahora se conoce un alias en este proceso de shell, que está bien, pero solo funciona en este proceso de shell.
$ sayHello
Hello world!
Desde que dijiste "Sayhello" en el mismo caparazón, funcionó.
$ nohup sayHello
Aquí, un programa "Nohup" se está iniciando como un proceso infantil. Por lo tanto, no recibirá los alias. Luego comienza el proceso infantil "Sayhello", que no se encuentra.
Para su problema específico, es mejor hacer que el nuevo "Perl" y "Python" parezcan los normales tanto como sea posible. Sugeriría establecer la ruta de búsqueda.
En su ~/.bash_profile add: export path = "/my/shiny/intérpretes/bin: $ {ruta}"
Luego relajar.
Dado que esta es una variable de entorno, voluntad pasar a todos los procesos infantiles, ya sean conchas o no, ahora debería funcionar muy a menudo.
Otros consejos
Para Bash: intenta hacer nohup 'your_alias
'. Esto funciona para mi. No sé por qué no se muestra la cita posterior. Ponga su alias dentro de las citas.
Con Bash, puede invocar una subshell interactivamente utilizando el -i
opción. Esto obtendrá tu .bashrc
así como habilitar el expand_aliases
opción de shell. De acuerdo, esto solo funcionará si su alias se define en tu .bashrc
cual es la convención.
Bash Manpage:
Si el
-i
La opción está presente, el shell es interactivo.expandir_aliases: Si se establece, los alias se expanden como se describe anteriormente en alias. Esta opción es habilitado por defecto para conchas interactivas.
Cuando se inicia un shell interactivo que no es un shell de inicio de sesión, Bash lee y ejecuta comandos de
/etc/bash.bashrc
y~/.bashrc
, si existen estos archivos.
$ nohup bash -ci 'sayHello'
Si miras el Alias sección del manual de bash, dice
La primera palabra de cada comando simple, si no cotiza, se verifica para ver si tiene un alias.
Desafortunadamente, no parece ser bash
tiene algo como zsh
's alias globales, que se expanden en cualquier posición.