.bashrc shebang linha relatórios comando não encontrado

3

Tentei as seguintes linhas de shebang:

$ head -n2 .bashrc | od -c
0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n 
$ bash
bash: #!/bin/bash: No such file or directory

.bashrc começa com a linha vazia supostamente (os três primeiros caracteres são invisíveis):

$ head -n2 .bashrc | od -c
0000000 357 273 277  \n   #   !   /   b   i   n   /   b   a   s   h  \n
$ bash:
: command not found

Depois dessa linha, as linhas bashrc são executadas normalmente, portanto, a funcionalidade NÃO é afetada. No entanto, acho esse erro muito chato.

Espero que este post ajude alguém.

    
por BogdanBiv 05.07.2014 / 09:35

2 respostas

1

Resolvido o problema fazendo um backup para .bashrc:

mv .bashrc ..bashrc
# recreating .bashrc:
touch .bashrc
$ bash # returns no errors !!!

Depois de editar o arquivo .bashrc com o vim, este é seu conteúdo:

head -n2 .bashrc | od -c
0000000   #   !   /   b   i   n   /   e   c   h   o       "   T   e   s
0000020   t   "  \n

O culpado parece ter sido os três caracteres invisíveis no começo do meu .bashrc: "357 273 277" . No começo, pensei que esses caracteres pertencessem ao meu arquivo .bashrc, então os deixei lá. Demorará um pouco para descobrir qual dos meus editores corrompe os arquivos dessa maneira.

Espero que este post ajude alguém.

    
por BogdanBiv 05.07.2014 / 09:44
8

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.

    
por Gilles 05.07.2014 / 12:11