Bien, entonces source
ejecuta 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.bashrc
archivo, 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 source
y .
, 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 .bashrc
de mi .bash_profile
.
Respuesta1
En bash
, .
y source
son sinónimos. Al examinar bash
el código fuente, el archivo builtin/source.def
, puede ver .
y source
utilizar 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 source
no 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$PATH
para 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 ./file
por . ./file
completo. 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 && . $_