Fuente vs. ¿Por qué un comportamiento diferente?

17

Hace poco aprendí que

. ./.a.aY ./.a.aes lo mismo.

Sin embargo, intentar source source .a.ada un error. En mi opinión, .ser alias de Bash sourceno debería comportarse de manera diferente, entonces, ¿qué me estoy perdiendo?

Bono, ¿por qué está . .bien mientras source sourceque no?

LAFK dice reinstalar a Mónica
fuente
8
Podría haber elegido un nombre más claro para su ejemplo :). En cualquier caso, lo que dio la idea de que . scripty ./scriptson la misma cosa? Ciertamente no lo son . Además, .no es un alias para source. Es al revés. .es el estándar y sourcees un alias de ..
terdon
2
Después de pasar un tiempo mirando scripts de shell, te acostumbras al .comando, pero quiero decir que sourcees un comando mejor, cuando ves source somefileen un script sabes de inmediato qué hace esa declaración, pero . somefile no solo no es obvio lo que hace, puedes perder fácilmente al . personaje por completo
the_velour_fog
Bono, por qué lo es. . ¿OK mientras que la fuente no lo es? - ¿En qué medida el mensaje de error bash: .: .: is a directoryen . .es ok necesidades deben ser explicadas.
contramode
@terdon - absolutamente correcto. El ejemplo original fue . ./.a.a .ser honesto. : -DA cuestionario de algún tipo, si quieres. :-) Pregunta vinculada es increíble, muchas gracias. Lo que me dio esa idea: el hecho de que no había visto ninguna diferencia en la ejecución de archivos de esta manera y el hecho de que leí en alguna parte .es un alias source. :-)
LAFK dice Reinstate Monica

Respuestas:

27

No se puede reemplazar .por sourcetodas partes; Si

. ./.a.a

funciona, puede reemplazar el primero .(al menos en Bash):

source ./.a.a

El segundo .representa el directorio actual, no puede reemplazarlo con source(especialmente no ./con sourcelo que ha hecho).

source source

estaría bien si tuviera un archivo llamado sourceen el directorio actual, que contiene algo significativo para su shell actual. No puedo ver cómo . .estaría bien ...

Además, . ./.a.ay ./.a.ano son lo mismo, la segunda forma se ejecuta .a.aen un shell separado. Consulte ¿Cuál es la diferencia entre el abastecimiento ('.' O 'fuente') y la ejecución de un archivo en bash? para detalles.

Stephen Kitt
fuente
9

sourcees una palabra clave de shell que se supone que debe usarse así: sourcefiledonde filecontiene comandos de shell válidos. Estos comandos de shell se ejecutarán en el shell actual como si estuvieran escritos desde la línea de comandos. Ahora, .filehace exactamente lo mismo.

Más allá de eso .solo significa "el directorio de trabajo actual" como en ./xyz(" xyzen este directorio") o a/b/./c/./d(que es idéntico a a/b/c/d).

Más allá de eso, .un nombre de archivo tiene un significado solo por convención, ya .foobarque indica un archivo "oculto" (no realmente ...) o como en foobar.pdf, que indica un formato de archivo con el sufijo (aquí .pdf).

Estos significados diferentes no pueden intercambiarse.

contramodo
fuente
8
.De ninguna manera está desactualizado. A diferencia de sourcela manera portátil, definida por POSIX , de obtener un archivo. El sourcealias es específico del shell y puede estar ausente (por ejemplo, en dash) o comportarse de manera diferente al estándar ..
terdon
Gracias @terdon, Wiki dice que la fuente como un punto (.) No es aceptable en C shell, donde apareció por primera vez el comando.
Noam Manos
1
@NoamManos quizás, pero el C-shell no es POSIX, por lo que puede (y lo hace) comportarse de manera muy diferente.
terdon