2010-04-14 5 views
9

Hoy estaba siguiendo algunas instrucciones para instalar un software en Linux. Había un script que debe ejecutarse primero. Establece algunas variables de entorno.Cuál es la diferencia entre "./somescript.sh" y ". ./somescript.sh"

La instrucción me dijo que ejecutara . ./setup.sh, pero cometí un error al ejecutar ./setup.sh. Entonces el env no estaba configurado. Finalmente noté esto y procedí.

Quiero saber la diferencia entre estos dos métodos de invocación de un script. Soy completamente nuevo en Linux, así que sea lo más elaborado posible.

+0

FYI - la gente que escribe esas instrucciones probablemente debería haberle pedido que escriba 'source./Setup.sh' en vez de'. ./setup.sh' para que sea menos ambiguo; el error que cometiste es muy común. –

+0

@Charles Duffy Gracias por señalar esto.Sí, las instrucciones son para uso interno, así que supongo que están destinadas a gurús. – zihaoyu

+0

'fuente' es solo Bash, mientras que' .' es portátil para Bourne shell. Si las instrucciones no son específicas de Bash, no puede usar 'fuente' aunque sería más legible. – tripleee

Respuesta

19

./setup.sh ejecuta el script, se iniciará un nuevo shell que ejecuta el script. Ese nuevo shell no puede afectar al shell primario que inició el script.

. ./setup.sh es una abreviatura de source ./setup.sh y ejecutará la secuencia de comandos en el shell actual, en lugar de iniciar un nuevo shell para ejecutarlo. Esto significa que el script puede alterar el comportamiento del shell actual, p. establecer nuevas variables de entorno

0

. hace referencia al directorio actual. Entonces ./script.sh significa ejecutar el script en el directorio actual.

../script.sh correría script.sh en el directorio principal.

. ./script.sh (con un espacio entre los puntos) se queja de algunas conchas como CSH pero en bash . foo es la abreviatura de source foo.

+0

'.' es un comando integrado de shell. Ver la respuesta de Leeeroy. – dave4420

+0

Acabo de descubrirlo. Lo intenté en csh y decía "comando no encontrado". Ahora veo que en bash es un atajo para "fuente". – dreeves

+0

'.' es un comando bash válido, equivalente a' source' –

3

Editar: Me acabo de dar cuenta de que no respondí la otra parte de su pregunta ... pero la respuesta de Leeroy hace eso. Como que respondí algo más, pero espero que ayude :-)

La función sh ejecuta bash en el script que se presenta. Ver the man page para obtener más información, pero se puede ver sh es básicamente sinónimo de bash

Cuando se ejecuta un script ala ./setup.sh que identifica el guión basado en lo que está en la parte superior del archivo, normalmente se conoce como la "Shebang"

Una escritura del golpe tendría

#!/bin/sh 

o similares en la parte superior del archivo, lo que permite utilizar el método de puntos. También puede utilizar otras cosas, como una secuencia de comandos de Python puede tener

#!/usr/bin/env/python 

Y si la ruta es correcta, sería ejecutar el script como una secuencia de comandos de Python en lugar de una fiesta de un solo uso de la notación de punto.

Espero que lo explique de una manera sencilla!

+0

Eso es cierto, pero no responde la pregunta. El punto clave es que '. ./setup.sh' puede alterar el shell actual, y './setup.sh' no puede. –

0

Sólo tiene que ejecutar "source /path/to/setup.sh"

Esto configurará las variables de entorno en el shell actual.

Cuestiones relacionadas