Ejecute el programa desde cualquier lugar sin cambiar el directorio

9

Deseo crear un alias, que ejecute el programa x, sin cambiar el directorio actual en el que estoy. Lo que tengo ahora es:

alias x = "cd /home/path_to_x && ./x"

Esto funciona, pero cambia mi directorio. Lo que deseo hacer es algo como:

alias x="./home/path_to_x/x

Pero luego no obtengo tal archivo o directorio. Alguien sabe una solución para esto?

El pescador
fuente
99
establecer un alias como alias x='/home/path_to_x/x'. No lo uses .antes /home. .(punto) se refiere al directorio actual.
souravc
2
¿ xRealmente necesita ser ejecutado mientras está en /home/path_to_x? ¿O simplemente no está seguro de cómo ejecutar un programa que reside en un directorio específico?
Adaephon
Una pregunta más similar askubuntu.com/questions/427818/…
c0rp

Respuestas:

13

NO CD, simplemente ejecútelo usando su ruta absoluta

Esta versión:

cd /home/path_to_x && ./x

cambia el directorio a una ruta absoluta (puede ver cómo /home/...comienza en el directorio raíz) y luego ejecuta el ejecutable en la ruta relativa./x (es decir, en relación con el nuevo directorio de trabajo).

Esta versión:

./home/path_to_x/x

intenta ejecutar el ejecutable en la ruta relativa./home/path_to_x/x , lo que significa en relación con lo que sea ​​su directorio de trabajo actual . Eso explica por qué obtienes el error: esta ruta relativa realmente no existe.

El comando que desea sería:

/home/path_to_x/x

usando la ruta absoluta (comenzando en el directorio raíz /) nuevamente.

Ah, y también puede agregar /home/path_to_xa su en PATHlugar de crear el alias. Ver: ¿Cómo ejecutar scripts sin escribir la ruta completa?

Inútil
fuente
Esta es la respuesta correcta para la pregunta planteada.
Pausado hasta nuevo aviso.
1
Esto solo sería incorrecto si el programa tuviera que ejecutarse en un directorio específico de donde provienepwd
Kaz Wolfe
@Whaaaaaat tiene razón. /home/path_to_x/xno es funcionalmente equivalente a (cd /home/path_to_x && ./x); si funciona o no depende de la aplicación.
Rmano
Aunque tiene razón en general, para esta pregunta específica, OP estaba tratando visiblemente de ejecutarse desde la ruta absoluta (solo con un error de un carácter). Sin embargo, estoy seguro de que pueden aclarar si el directorio de trabajo es importante en este caso.
Inútil
8

Si no desea cdque se pegue después de la sustitución de alias, use una subshell con (y ):

alias my_x="(cd /home/path_to_x && ./x)&" 

puedes consultarlo con

alias test_y="(cd /tmp && sleep 10 ) & "

Tenga en cuenta que la solución

alias my_y="/home/path_to_x/x" 

No es exactamente equivalente. De hecho, si se llama a través de my_x, el xprograma se ejecuta con un directorio actual /home/path_to_x/, mientras que si se llama por my_y, xse ejecuta con un directorio actual que es donde my_yse emitió el comando . Esto puede ser importante o no, dependiendo de lo que xesté haciendo.

Sobre la solución OP , funciona en bash:

romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null  &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano

pero no en zsh:

[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1]  + 16744 done       ./echo A > /dev/null                                    
1& [romano:/bin] % pwd
/bin
[romano:/bin] % 

Parece que bash y zsh ejecutan listas de diferentes maneras ... así que es mejor agregar el paréntesis explícito ... gracias @EliahKagan por señalarme.

Rmano
fuente
1
Otorgarle &una prioridad más alta de lo que &&parece ser exclusivo zsh. Probé sleep 5 && echo done &en zsh, bash, ksh, mksh, dash, e incluso una cáscara no-estilo Bourne ( tcsh). Solo zshevaluado sleep 5en primer plano; todos los demás regresaron inmediatamente (luego también impresos donecinco segundos después, por supuesto). Por otro lado, incluso si esto es completamente una peculiaridad de zsh, creo que agregar explícito ( )(o { ;}) es razonable, ya que transmite la intención a otros humanos (o a uno mismo, al leer el guión o la historia más adelante).
Eliah Kagan
4

Si el archivo que desea ejecutar ya es ejecutable, ¿por qué no lo agrega a su variable PATH?

Si su archivo ejecutable es /home/user/aplication/appXsolo ingrese

PATH=$PATH:/home/user/application

a su ~/.bashrco~/.profile

Después de reiniciar su consola, puede ejecutarla simplemente con appX

Creo que esta es la solución más limpia.

0xAffe
fuente
3

Poner un &al final parece hacer el truco:

alias x = "cd /home/path_to_x && ./x &"
El pescador
fuente
2
¿Estás seguro? Después de ejecutar xestás dentro /home/path_to_x. Al &final, simplemente envíe el proceso en segundo plano.
Rmano
2
@Rmano Esto realmente funciona. cdLos trabajos en segundo plano no afectan a la persona que llama (lo cual tiene sentido, sería realmente extraño si lo hicieran). Esto se debe a que la ejecución asincrónica usa una subshell . Aunque esto sería mejor si explicara por qué funciona y qué &funciona, y cómo ejecutar en segundo plano a veces es indeseable, esta es (ya) una respuesta correcta. ( Hacer explícitamente una subshell con ( )sintaxis, como sugiere , es probablemente una mejor solución la mayoría de las veces).
Eliah Kagan
@EliahKagan tienes razón. Verifiqué la solución zshy efectivamente funciona en bashy no en zsh... debe haber alguna diferencia en cómo se expanden los alias.
Rmano
Hice
Rmano
@Rmano hizo habilita los ajustes relacionados con pushden zsh(tengo setopt autopushd pushdsilent pushdtohome, y se acuerda de mi cwd.)
Muru
0

Obtenga una copia de seguridad de su pwd actual y, después de ejecutar su comando, deshaga su último pwd.

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'
αғsнιη
fuente
No entendiste el efecto del alias de ese Rmano. La línea de comando no está bloqueada. Es solo que la salida del alias ( test) empujó el cursor a la siguiente línea. Todavía puede hacer lo que quiera allí (incluyendo presionar enter para abrir un nuevo mensaje nuevo).
muru
Sí, sí correcto. @mure: |
αғsнιη
Tenga en cuenta que, dado que utiliza comillas dobles, la variable incluirá el directorio actual en el momento en que se defina el alias . Use comillas simples para diferir la evaluación hasta que se expanda el alias. Sin embargo, pushdy popdhaz lo que tu respuesta hace. alias x='pushd /home/path_to_x && ./x && popd'
Pausado hasta nuevo aviso.