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?
command-line
alias
El pescador
fuente
fuente

alias x='/home/path_to_x/x'. No lo uses.antes/home..(punto) se refiere al directorio actual.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?Respuestas:
NO CD, simplemente ejecútelo usando su ruta absoluta
Esta versión:
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:
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:
usando la ruta absoluta (comenzando en el directorio raíz
/) nuevamente.Ah, y también puede agregar
/home/path_to_xa su enPATHlugar de crear el alias. Ver: ¿Cómo ejecutar scripts sin escribir la ruta completa?fuente
pwd/home/path_to_x/xno es funcionalmente equivalente a(cd /home/path_to_x && ./x); si funciona o no depende de la aplicación.Si no desea
cdque se pegue después de la sustitución de alias, use una subshell con(y):puedes consultarlo con
Tenga en cuenta que la solución
No es exactamente equivalente. De hecho, si se llama a través de
my_x, elxprograma se ejecuta con un directorio actual/home/path_to_x/, mientras que si se llama pormy_y,xse ejecuta con un directorio actual que es dondemy_yse emitió el comando . Esto puede ser importante o no, dependiendo de lo quexesté haciendo.Sobre la solución OP , funciona en
bash:pero no en
zsh: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.
fuente
&una prioridad más alta de lo que&&parece ser exclusivozsh. Probésleep 5 && echo done &enzsh,bash,ksh,mksh,dash, e incluso una cáscara no-estilo Bourne (tcsh). Solozshevaluadosleep 5en primer plano; todos los demás regresaron inmediatamente (luego también impresosdonecinco segundos después, por supuesto). Por otro lado, incluso si esto es completamente una peculiaridad dezsh, 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).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 ingresea su
~/.bashrco~/.profileDespués de reiniciar su consola, puede ejecutarla simplemente con
appXCreo que esta es la solución más limpia.
fuente
Poner un
&al final parece hacer el truco:fuente
xestás dentro/home/path_to_x. Al&final, simplemente envíe el proceso en segundo plano.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).zshy efectivamente funciona enbashy no enzsh... debe haber alguna diferencia en cómo se expanden los alias.pushdenzsh(tengosetopt autopushd pushdsilent pushdtohome, y se acuerda de mi cwd.)Obtenga una copia de seguridad de su pwd actual y, después de ejecutar su comando, deshaga su último pwd.
fuente
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).pushdypopdhaz lo que tu respuesta hace.alias x='pushd /home/path_to_x && ./x && popd'