Fonte vs. por que comportamento diferente?

17

Eu aprendi recentemente que

. ./.a.ae ./.a.aé o mesmo.

No entanto, tentar source source .a.adá um erro. Na IMO, .ser o apelido de Bash sourcenão deve se comportar de maneira diferente, então o que estou perdendo?

Bônus, por que está tudo . .bem enquanto source sourcenão está?

LAFK diz Restabelecer Monica
fonte
8
Você poderia ter escolhido um nome mais claro para o seu exemplo :). De qualquer forma, o que lhe deu a ideia . scripte ./scripté a mesma coisa? Eles certamente não são . Além disso, .não é um alias para source. É o contrário. .é o padrão e sourceé um alias de ..
terdon
2
Depois de passar algum tempo olhando para os scripts de shell, você se acostuma com o .comando, mas quero dizer que sourceé apenas um comando melhor, quando você vê source somefileem um script imediatamente saber o que essa declaração faz, mas . somefile não apenas não é óbvio o que faz, você pode facilmente perder o . caráter completamente
the_velour_fog
Bônus, por que é. . OK enquanto a fonte de origem não é? - em que medida a mensagem de erro bash: .: .: is a directoryna . .é necessidades ok para ser explicadas.
Countermode #
@terdon - absolutamente certo. O exemplo original era . ./.a.a .para ser honesto. : -DA questionário das sortes, se preferir. :-) A pergunta vinculada é incrível, muito obrigado. O que me deu essa idéia: o fato de eu não ter visto diferença na execução de arquivos dessa maneira e o fato de ler em algum lugar .é um pseudônimo source. :-)
LAFK diz Reinstate Monica 14/09

Respostas:

27

Você não pode simplesmente substituir .por sourcetodos os lugares; E se

. ./.a.a

funciona, você pode substituir o primeiro .(pelo menos no Bash):

source ./.a.a

O segundo .representa o diretório atual, você não pode substituir isso com source(especialmente não ./com sourcecomo você fez).

source source

seria bom se você tivesse um arquivo chamado sourceno diretório atual, contendo algo significativo para o seu shell atual. Eu não consigo ver como . .seria bom ...

Além disso, . ./.a.ae ./.a.anão é o mesmo, o segundo formulário é executado .a.aem um shell separado. Consulte Qual é a diferença entre sourcing ('.' Ou 'source') e executar um arquivo no bash? para detalhes.

Stephen Kitt
fonte
9

sourceé uma palavra-chave do shell que deve ser usada assim: sourcefilewhere filecontém comandos válidos do shell. Esses comandos do shell serão executados no shell atual como se digitados na linha de comando. Agora, .filefaz exatamente o mesmo.

Além disso ., significa "o diretório de trabalho atual" como em ./xyz(" xyzneste diretório") ou a/b/./c/./d(que é idêntico a a/b/c/d).

Além disso ., um nome de arquivo tem um significado apenas por convenção, pois .foobarindica um arquivo "oculto" (na verdade não ...) ou como foobar.pdfindica um formato de arquivo pelo sufixo (aqui .pdf).

Esses significados diferentes não podem ser trocados.

contra-modo
fonte
8
.não está desatualizado. Diferentemente sourcedo portátil, e definida pelo POSIX de obter um arquivo. O sourcealias é específico do shell e pode estar ausente (por exemplo, em dash) ou se comportar de maneira diferente do padrão ..
terdon
Obrigado @terdon, o Wiki diz que a fonte como um ponto (.) Não é aceitável no shell C, onde o comando apareceu pela primeira vez.
Noam Manos
1
@ NoamManos talvez, mas o C-shell não é POSIX, portanto pode (e faz) se comportar de maneira muito diferente.
terdon