2012-05-24 22 views
16

En Bash scripting, ¿hay una sola alternativa de declaración para esto?Incluir/secuencia de comandos de origen si existe en Bash

if [ -f /path/to/some/file ]; then 
    source /path/to/some/file 
fi 

Lo más importante es que el nombre de archivo es no sólo una vez, sin que sea una variable (que añade aún más líneas).

Por ejemplo, en PHP que podría hacerlo de esta manera

@include("/path/to/some/file"); // @ makes it ignore errors 

Respuesta

2

Usted podría intentar

test -f $FILE && source $FILE 

Si test vuelve falsa, la segunda parte de && no se evalúa

+1

Un poco mejor, pero preferiría tener $ FILE solo una vez (upd ated the question) –

+0

Dado que es una variable, su valor será constante, no creo que deba preocuparse por ello – Attila

+0

Eso es todo, no es necesariamente una variable –

4

Si le preocupa la advertencia (y la falta de existencia del archivo fuente no es crítica para su secuencia de comandos) simplemente deshágase de la advertencia:

source FILE 2> /dev/null 
+0

El archivo es opcional, por lo que no se espera, ¿pero esto no descarta ningún resultado generado por el script incluido? –

+0

@BartvanHeukelom: Sí, pero solo descartará cualquier salida enviada al * error * estándar por el script. Cualquier salida enviada a la salida estándar por la secuencia de comandos vendrá bien. – ayaz

0

Si no tienen que ver con la salida de la secuencia de comandos, sólo podría redirigir el error estándar a /dev/null con algo como esto:

$ source FILE 2> /dev/null

9

Si usted está preocupado acerca de un uno trazador de líneas sin repetir el nombre del archivo, tal vez:

FILE=/path/to/some/file && test -f $FILE && source $FILE 
23

está definiendo su propia versión de @include una opción?

include() { 
    [[ -f "$1" ]] && source "$1" 
} 

include FILE 
+0

Actualmente no, pero sí, podría funcionar en algunas situaciones. –

2

Esta es la más corta que podría conseguir (nombre de fichero más 20 caracteres):

F=/path/to/some/file;[ -f $F ] && . $F 

Es equivalente a:

F=/path/to/some/file 
test -f $F && source $F 

para mejorar la legibilidad, prefiero esta forma:

FILE=/path/to/some/file ; [ -f $FILE ] && . $FILE 
Cuestiones relacionadas