2008-11-13 31 views
6

Esto puede ser una pregunta demasiado genérica como lo es pero ... Estoy perplejo al tratar de moverse a través de los directorios desde un script de shell. No soy un usuario avanzado de * nix, pero me siento cómodo trabajando a través de la línea de comandos para la mayoría de las tareas. Me gustaría llamar a un script que puede mover 'yo' a un directorio en lugar de sólo el proceso de escritura similar a la siguiente:Bash Shell Secuencias de comandos: qué lógica simple me falta

prompt:> goto lit 

donde goto es un alias ->goto='./goscript'
y
goscript tiene un código simple en tales como:

cd /path to work dirs/lit/user dir 

(suponiendo que cada usuario tiene un directorio dentro de/lit)

he evitado este problema yo mismo estableciendo mi alias personal 'para moverme al directorio deseado, ejecutar un script y luego volver al directorio original. Esta pregunta me llegó por un compañero de trabajo que usa un método similar, pero quería hacer que el proceso fuera más genérico, así que no necesitamos crear todos los alias que necesitamos. Pensé que este sería un problema fácil de resolver, pero estoy perplejo ya que realmente no tengo una gran experiencia en scripts ... hasta el momento.

+0

Ver http://stackoverflow.com/questions/255414/why-doesnt-cd-work-in-a-bash-shell-script –

Respuesta

2

No puede. El script tiene su propia copia del entorno, por lo que no puede cambiar el entorno del shell de inicio de sesión.

0

No puede usar cd en una secuencia de comandos bash. Sin embargo, podría alias el cd y la ruta.

alias goto='cd /path_to_work/usr/dir' 

ACTUALIZACIÓN: se pondría esa línea en su archivo .bashrc y luego hacer

source ~/.bashrc 

para crear el alias.

0

Puede lograr algunas cosas simples como esta usando un alias. Por ejemplo, tengo algunos alias que me ubican en un entorno de espacio de trabajo y configuran variables para nuestro sistema Makefile. Aquí hay un alias real que estoy usando como ejemplo. El '& &' continuará ejecutando los comandos hasta que uno de ellos falle; en escenarios simples como este, no se necesita ninguna limpieza, ya que no es probable que ocurra una falla.

alias main1='cd ~/code/main1 && export TOP=`pwd` && export DEBUG=1' 

Si se quiere desarrollar una biblioteca compartida de alias entre sus compañeros de trabajo, se pueden compartir a través de NFS y la fuente del archivo que se va incluido.

0

Cada secuencia de comandos tiene su propia idea del directorio de trabajo actual. "cd" no es un proceso sino un build-in de shell.

La forma de hacer lo que desea es crear un alias. En CSH será algo como:

alias goto 'cd /path_to_work/\!*/user_dir' 

sh/bash tiene instalaciones similares alias

5

Se puede crear una función que se llama Goto (o lo que sea) y asegúrese de que está definido en su .bashrc (o puede "origen" desde su shell actual):

function goto { 
    # the "$USER" part will expand to the current username 
    # the "$1" will expand to the first argument to the function ("goto xyz" => $1 is "xyz") 
    cd /some-path/lit/$USER/$1 
} 

Ponga esto en ~ /.bashrc o en un archivo separado y llamar a la "fuente del fichero" de su pronta entonces se puede llamar a la función al igual que cualquier otro programa:

prompt> goto folder 
cd /some-path/lit/your-user/folder 
4

para ejecutar un script en el mismo entorno de su pronta usted tiene que invocarlo con.

Digamos que tiene la secuencia de comandos llamado a:

cd .. 

si se invoca con. que se obtiene:

$> pwd 
$> /home/users/rd/proj 
$> . up 
$> pwd 
$> /home/users/rd 
+0

El punto es en realidad equivalente al comando "fuente". Aunque al menos en mi sistema tengo que escribir "./up" en lugar de solo ". Up" - de lo contrario obtendré un error: "bash: ELF: comando no encontrado" –

+0

Tienes razón sobre la fuente. La razón por la que cometiste el error es que no tienes. en el camino. Ese es el comportamiento predeterminado (cuya razón nunca he entendido bien) para muchos shell unix. –

+0

@ Remo.D: el motivo es la seguridad. Asegura que no ejecutará accidentalmente un comando del directorio actual en lugar del comando "real". Imagine un script de shell en su directorio principal llamado 'ls' cuyo contenido fuera 'rm -rf /' –

0

que tienden a tener un par de docenas de alias en mi .rc que se ven así:

alias work='cd /home/foo/work' 
alias rails='cd /home/foo/rails' 
alias assets='cd /home/foo/rails/assets' 

etc.

Si eso no va a funcionar para usted , es posible que pueda usar los ganchos de depuración en bash para reemplazar la línea de comandos en el lugar antes de que se ejecute, si la palabra clave 'goto' es lo primero en la línea. Esto implicará buscar en Google 'trampa' en bash, pero estén prevenidos, tales conjuros no se comportan igual en todos los sistemas. Escribí una de esas experiencias hace unos meses, y le invitamos al the results.

9

¡Incluso mejor que usar un alias como otros han descrito, eche un vistazo a la variable CDPATH! Es básicamente equivalente a la funcionalidad PATH, pero se aplica al comando cd.

Por ejemplo, si defino mi CDPATH como $CDPATH:${HOME}/subdir, y ~/subdir contiene otro directorio, subsubdir, entonces yo simplemente puedo ejecutar:

cd subsubdir 

desde cualquier directorio, y navegar por el camino de la forma esperada.

Aquí hay algunos detalles más:

http://www.caliban.org/bash/#bashtips

para establecer la variable CDPATH, añadir una línea a su .bashrc, como

export CDPATH=$CDPATH:${HOME}/subdir 
+0

+1 para usar la herramienta correcta para el trabajo ...algo que intento enseñar a mis hijos, que parecen pensar que todo es un martillo. –

+0

Además, si valora su cordura, asegúrese de que el primer carácter en el valor de CDPATH es ':' para que cuando escriba 'cd bin' y haya un directorio bin en el directorio actual, allí es donde debe ir. –

1

yo no era un miembro de cuando hice esta (Irónicamente, mi pregunta anónima de inicio de sesión tiene más estilo que mis preguntas de inicio de sesión oficiales combinadas), por lo que no puedo cerrarla ahora, pero ... La Remo D. et al. la respuesta sería la que condujo a la solución de trabajo que necesitábamos. Si alguien con poderes mod puede cerrar este &, seleccione esa como la respuesta aceptada, lo haría con la correspondiente.

Cuestiones relacionadas