¿Está bien usar "." ejecutar archivos en lugar de fuente - en .bashrc en Ubuntu y OS X?

11

OK, entonces sourceejecuta el script en el shell actual y por .separado, como se detalla en el script en ejecución con "." Y con "source", por ejemplo, pero, específicamente, en mi .bashrcarchivo, tengo:

[ -f ~/.bash_aliases ] && source ~/.bash_aliases
[ -f ~/.git-completion.bash ] && source ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && source ~/.autojump/etc/profile.d/autojump.sh

¿Puedo reemplazar esto con:

[ -f ~/.bash_aliases ] && . ~/.bash_aliases
[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && . ~/.autojump/etc/profile.d/autojump.sh

¿Funcionará en OS X? ¿Es ese el problema de "POSIX"?

Lo intenté y lo anterior todavía parece funcionar en Ubuntu (por lo que en realidad funcionan con ambos sourcey ., es decir, me dan la funcionalidad deseada en el shell). ¿Debo elegir uno sobre el otro, o me estoy perdiendo algo?

FWIW, en OS X, obtengo mi .bashrcde mi .bash_profile.

Michael Durrant
fuente
1
Si se trata de shells basados ​​en 'sh', estaría usando '. para compatibilidad global y si está usando shells basados ​​en 'csh', estaría usando source.
mdpc
2
¿En qué parte de la publicación vinculada ves que " sourceejecuta el script en el shell actual y por .separado"? Ambos lo ejecutan en el shell actual; de lo contrario no tendría sentido
Michael Mrozek

Respuestas:

11

Esta es la definición de POSIX de .dot:

El shell ejecutará comandos del archivo en el entorno actual.

Si el archivo no contiene un /<slash>, el shell utilizará la ruta de búsqueda especificada por $PATHpara encontrar el directorio que contiene el archivo. Sin embargo, a diferencia de la búsqueda de comando normal, el archivo buscado por la .dot utilidad no necesita ser ejecutable. Si no se encuentra un archivo legible, se anulará un shell no interactivo; un shell interactivo escribirá un mensaje de diagnóstico de error estándar, pero esta condición no se considerará un error de sintaxis.

Teniendo en cuenta lo anterior, también podría reemplazarlo [ -f ./file ] && source ./filepor . ./filecompleto. Si el archivo no está allí, lo peor que sucederá es que recibirás un aviso al iniciar sesión, que probablemente sea la información que quieras tener, creo.

Por supuesto, si prefiere mantener la prueba, podría hacer:

test -f ./file && . $_
mikeserv
fuente
2
Oh, gente que sabe $_, me gusta eso. :)
Andreas Wiese
@AndreasWiese, todos deberían hacerlo, es uno de los 7 parámetros especiales definidos por POSIX.
mikeserv
+1 Terminé usando el test -f /.file && . $_enfoque que se muestra aquí
Michael Durrant,
66
@mikeserv No, $_no está estandarizado por POSIX. Los 8 parámetros especiales son $@, $*, $#, $$, $!, $?, $-y $0. $_se omite de forma explícita . Su comentario incorrecto provocó una pregunta .
Gilles 'SO- deja de ser malvado'
19

En bash, .y sourceson sinónimos. Mirando el bashcódigo fuente, el archivo builtin/source.def, puede ver .y sourceusar la misma función interna source_builtin:

$BUILTIN source
$FUNCTION source_builtin
$SHORT_DOC source filename [arguments]
Execute commands from a file in the current shell.

Read and execute commands from FILENAME in the current shell.  The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.

Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
$END

$BUILTIN .
$DOCNAME dot
$FUNCTION source_builtin
$SHORT_DOC . filename [arguments]
Execute commands from a file in the current shell.

Pero sourceno es compatible con POSIX, por lo que si su secuencia de comandos se llama con POSIX /bin/sh, debe usar en .lugar de source. Dado que POSIX no restringe el shell, todo su script anterior funcionará.

Personalmente, siempre uso en .lugar de source. (Muchos scripts que escribí se ejecutan bajo cron).

Cuonglm
fuente
En igualdad de condiciones, use "fuente" en lugar de "". por una razón: intente buscar / grep para "." expresiones en un guión grande. Es una pesadilla.
abonet
Aunque esta respuesta explica por qué usar .es generalmente "mejor" que usar source, como dice @abonet, sourcees mucho más fácil de buscar. Dado que los períodos son signos de puntuación en muchos idiomas, es fácil para el ojo saltarselos. Por eso prefiero usar source.
Joe