Seu arquivo não começa com #!/bin/bash
, ele começa com a sequência de três bytes 357 273 277 (onde cada byte é digitado em octal; isso é ef bb bf no hexadecimal mais comum) é o UTF-8 codificação do caractere Unicode U + FEFF ZERO WIDTH NO-BREAK SPACE. Observe a distinção entre caractere endoding (uma correspondência entre caracteres ou seqüência de caracteres e seqüências de bytes, como UTF-8 ) e conjunto de caracteres (uma correspondência entre os caracteres e sua representação, como Unicode), porque é importante aqui .
O caractere U + FEFF também é chamado de marca de ordem de bytes (BOM) . Este caractere é usado no início dos arquivos de texto codificados em UTF-16 . O UTF-16 usa uma representação baseada em unidades de dois bytes, e os bytes dentro de cada unidade podem estar em qualquer ordem: big-endian ou little -endian (só tem que ser consistente dentro de um arquivo de texto). O caractere BOM é usado para indicar o endianness de um arquivo codificado em UTF-16 (o caractere simétrico U + FFFE é intencionalmente desatribuído, portanto os dois primeiros bytes só podem ser válidos em um dos dois endiannesses possíveis).
A interpretação de lista técnica de U + FEFF só faz sentido em codificações que têm uma ordem de bytes, como UTF-16. A codificação UTF-8 não tem nenhum conceito de ordem de bytes, pois os caracteres são codificados em uma seqüência de bytes (tamanho variável) com uma ordem bem definida. Portanto, em UTF-8, a seqüência de bytes ef bb bf é apenas o caractere U + FEFF, que é apenas outro caractere Unicode não-ASCII.
O Bash, como muitos outros programas, trata todos os caracteres ASCII como caracteres comuns que podem aparecer em strings. Para o bash, as strings incluem palavras nuas. Isto tem a vantagem de o bash poder trabalhar com entrada em qualquer codificação desde que essa codificação seja um superconjunto de ASCII, isto é, os caracteres no conjunto ASCII são codificados como um byte com o seu valor de codificação ASCII. UTF-8 é tal codificação. U + FEFF é um espaço de largura zero e, portanto, é invisível para os humanos, mas é visível para os programas. Programas que interpretam sua entrada no Unicode podem tratá-la como um caractere de espaço em branco, mas programas que interpretam sua entrada como ASCII e caracteres não-ASCII sem sentido não.
No seu arquivo, o bash vê uma seqüência inicial de 14 bytes que analisa como caracteres comuns: ef bb bf 23 21 2f 62 69 6e 2f 62 61 73 68. Os três primeiros codificam um U + FEFF no UTF-8 codificação; O analisador de bash não se importa com a codificação e os trata como três caracteres comuns. O quarto caractere #
não é um caractere de início de comentário porque não está no início de uma palavra. A palavra de 14 caracteres resultante é interpretada como um nome de comando e não há comando com esse nome.
Os scripts do shell, como a maioria dos outros textos de programa, devem ser escritos em uma codificação compatível com ASCII. Certifique-se de que seu editor não adicione caracteres falsos, como retornos de carro antes de novas linhas (a codificação do Windows de terminações de linha, mas programas Unix tratam o retorno de carro como um caractere comum) ou U + FEFF no início. U + FEFF é uma marca de ordem de byte apenas no início de um arquivo codificado em UTF-16 de qualquer maneira; quando é usado no começo de um arquivo codificado em UTF-8, é apenas um espaço inútil no começo. Se um editor adicionar U + FEFF no início de um arquivo em UTF-8, isso é um erro.
Além de tudo isso, uma linha shebang não é útil na parte superior de .bashrc
. Apesar de não causar nenhum dano (o dano aqui foi porque você não tinha uma linha de shebang válida), é espúria e potencialmente confusa. Esse arquivo nunca é executado como um script autônomo.