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.x
Realmente 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_x
a su enPATH
lugar de crear el alias. Ver: ¿Cómo ejecutar scripts sin escribir la ruta completa?fuente
pwd
/home/path_to_x/x
no es funcionalmente equivalente a(cd /home/path_to_x && ./x)
; si funciona o no depende de la aplicación.Si no desea
cd
que 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
, elx
programa se ejecuta con un directorio actual/home/path_to_x/
, mientras que si se llama pormy_y
,x
se ejecuta con un directorio actual que es dondemy_y
se emitió el comando . Esto puede ser importante o no, dependiendo de lo quex
esté 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
). Solozsh
evaluadosleep 5
en primer plano; todos los demás regresaron inmediatamente (luego también impresosdone
cinco 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/appX
solo ingresea su
~/.bashrc
o~/.profile
Después de reiniciar su consola, puede ejecutarla simplemente con
appX
Creo que esta es la solución más limpia.
fuente
Poner un
&
al final parece hacer el truco:fuente
x
estás dentro/home/path_to_x
. Al&
final, simplemente envíe el proceso en segundo plano.cd
Los 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).zsh
y efectivamente funciona enbash
y no enzsh
... debe haber alguna diferencia en cómo se expanden los alias.pushd
enzsh
(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).pushd
ypopd
haz lo que tu respuesta hace.alias x='pushd /home/path_to_x && ./x && popd'