¿Está bien utilizar "." ejecutar archivos en lugar de fuentes, en .bashrc en Ubuntu y OS X?

¿Está bien utilizar "." ejecutar archivos en lugar de fuentes, en .bashrc en Ubuntu y OS X?

Bien, entonces sourceejecuta el script en el shell actual y .por separado, como se detalla enejecutando script con "." y con "fuente"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 "POSIX"?

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

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

Respuesta1

En bash, .y sourceson sinónimos. Al examinar bashel código fuente, el archivo builtin/source.def, puede ver .y sourceutilizar 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, todos los scripts anteriores funcionarán.

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

Respuesta2

Esto esDefinición de POSIXde .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 comandos normal, el archivo buscado por la .dot utilidad necesitanoser ejecutable. Si no se encuentra ningún archivo legible, se abortará un shell no interactivo; un shell interactivo escribirá un mensaje de diagnóstico en el error estándar, pero esta condición no se considerará un error de sintaxis.

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

Por supuesto, si prefieres conservar la prueba, puedes hacer:

test -f ./file && . $_

información relacionada