Quiero escribir un código que me permita cambiar a algunos directorios a los que suelo ir. Digamos que este programa es mycd
y /a/very/long/path/name
es el directorio al que quiero ir.
Así que simplemente puedo escribir en mycd 2
lugar de cd /a/very/long/path/name
. Aquí supongo que mycd
sabe se 2
refiere a eso /a/very/long/path/name
. También puede haber mycd 1
, mycd 3
, ... etc.
El problema es que tengo que escribir mycd
como un script de shell y escribir . mycd 2
para hacer lo que deseo porque, de lo contrario, el script simplemente se ejecuta en un script secundario que no cambia nada sobre el shell primario que realmente me interesa.
Mi pregunta es:
¿Puedo hacerlo sin usar
source
? porque se. mycd
supone quemycd
tiene que ser un script de shell y esto también podría introducir algunas funciones que no quiero.¿Puedo implementarlo en otros lenguajes de programación?
fuente
mycd
pasar$@
cualquier programa que me guste."$@"
para que cualquier argumento que contenga espacios en blanco se maneje correctamente.No puede cambiar el directorio actual de un shell desde otro proceso. Solo el proceso en sí puede cambiar su propio directorio actual. Esto también es válido para algunas otras características, como las variables de entorno y los descriptores de archivo.
En realidad, es posible afectar el directorio actual de otro proceso al hacer que ejecute una
chdir
llamada del sistema a través de laptrace
llamada del sistema, que es lo que permite que los depuradores funcionen. Sin embargo, si el proceso mantiene algunas estructuras de datos internas que tienen que ser consistentes con el directorio actual actual, es probable que el programa se bloquee. Para un shell, este enfoque no tiene oportunidad de funcionar.Necesita organizar su código para que lo ejecute el propio shell. La forma normal de proceder sería convertirlo en una función de shell y almacenarlo en su
~/.bashrc
. Si esto no es posible, por ejemplo, porque es un código que desea distribuir, escriba un archivo fuente de shell que contenga la definición de la función y diga a las personas que hagan que su shell interactivo lea su archivo con el.
comando .fuente
ws=$1; gdb -p $(ps h -o ppid -p $$) -ex "call chdir(\"$wd\")" -ex "call set_working_directory(\"$wd\")" -ex detach -ex q -batch
. Ejecutar comobraindead-cd-parent /
. Verá quepwd
regresa/
y también lo hacels
, etc. comportarse. Pero el prompt (PS1
) aún no ha cambiado, los ojos de las personas están lastimados, etc. Por lo tanto, no haga esto incluso si es posible.ptrace
método que menciono. Funciona bien en programas que no se preocupan mucho por su directorio actual. En un shell, muchas cosas (PWD
variables, avisos, etc.) se volverán incorrectas, y el shell puede bloquearse o comportarse mal.Como señaló usted mismo, los scripts de shell siempre se ejecutan en un subshell, que no puede influir en su shell principal.
Sin embargo, puedes ...
alias mycd2='cd /a/very/long/path/name'
haga que su script 1 envíe un comando de shell válido
... y ejecuta su salida:
$(mycd 2)
1: Probablemente quiera usar una
case
declaración en lugar de laif
condición en el ejemplo.fuente