Como obtenho o bash para dar um erro relevante para um arquivo com o fim de linha do windows?

2

Suponha que eu tenha o seguinte script de shell:

#!/bin/bash \n
echo "Hello World" \n

A execução dá

Hello world. 

Agora, suponha que eu tenha o seguinte script de shell

#!/bin/bash \r\n
echo "Hello world" \r\n

A execução dá o resultado:

bad interpreter: No such file or directory

Para o recém-chegado - isso não aponta realmente para a causa do problema (dado que a causa é o espaço em branco). O que você realmente precisa é de um erro que diga qual é o problema.

A minha pergunta é: Como obtenho o bash para dar um erro relevante para um arquivo com fins de linha do windows?

EDITAR:

O contexto aqui é alguém que olha para o arquivo e não vê as terminações de linha - e criou essa situação involuntariamente. Quando perguntados sobre a diferença entre os arquivos de texto no Unix e os arquivos de texto no Windows, eles respondem: "O que você quer dizer? É apenas texto simples?" A questão é direcionada a solicitar ao usuário que examine a causa raiz do problema.

    
por hawkeye 19.06.2016 / 02:34

1 resposta

3

O problema é que o erro está acontecendo antes que o bash seja executado.

Quando você executa um script que começa com #! , o kernel examina o restante da linha e o executa, com o nome do arquivo como o primeiro parâmetro. Portanto, quando você tiver um arquivo no formato DOS, o kernel verá /bin/bash^M e tentará executá-lo como o programa. O que, claro, não existe.

Se você quisesse ser um pouco insano, você poderia criar um programa chamado /bin/bash^M ...

$ ls -lb /bin/bash?
-rwxr-xr-x 1 root root 61 Jun 18 22:41 /bin/bash\r

$ cat /bin/bash?
#!/bin/sh
echo Convert your program to Unix format!
exit 255

$ file foo
foo: Bourne-Again shell script, ASCII text executable, with CRLF line terminators

$ cat -v foo
#!/bin/bash^M
echo hello^M

$ ./foo
Convert your program to Unix format!

$ dos2unix foo
dos2unix: converting file foo to Unix format ...

$ ./foo
hello

Eu não tenho certeza se eu recomendaria isso!

Em vez disso, eu recomendaria a educação e um "livro de execução" de diagnóstico (por exemplo, os terminadores de linha CRLF do relatório de comando file ).

    
por 19.06.2016 / 04:46