Se um script copiado do Windows parece normal, mas o macOS relata um "bad interpreter" ou se comporta como se os comandos tivessem um caractere extra, verifique se há quebras de linha CRLF do Windows. As ferramentas de linha de comando do macOS esperam LF. Você pode confirmar o tipo de arquivo, converter uma cópia com ferramentas já presentes no macOS e, em seguida, executar o script reparado novamente.
Por que as quebras de linha quebram um script no macOS
Uma quebra de linha é um caractere (ou par de caracteres) que marca o final de uma linha de texto. As ferramentas de linha de comando do macOS usam LF (\n); o Windows comumente usa CRLF (\r\n). Com o CRLF, o retorno de carro (carriage return) pode permanecer anexado a uma linha quando um comando Unix a lê. A Apple documenta que esse caractere extra pode causar comportamentos inesperados em ferramentas de linha de comando e scripts. Guia de shell scripting da Apple
Pistas comuns incluem /bin/bash^M: bad interpreter, uma mensagem de comando não encontrado que parece incluir um \r no final, ou uma análise (parsing) que falha mesmo que o script visível pareça correto. Esses sintomas podem ter outras causas; verificar o arquivo é um primeiro passo útil, não uma prova definitiva por si só.
Verifique o formato de quebra de linha do script
Abra o Terminal, navegue até a pasta que contém o script e inspecione-o com file. Coloque o nome do arquivo entre aspas para que espaços e metacaracteres do shell sejam tratados literalmente:
cd "$HOME/Downloads"
file "my script.sh"
Se a saída disser que o arquivo possui terminadores de linha CRLF, isso apoia o diagnóstico. Se relatar LF, as quebras de linha podem não ser a causa. A descrição do comando file do macOS pode variar, e quebras de linha mistas podem não ser resumidas com clareza, portanto, utilize também a mensagem de erro e o contexto do código-fonte do script. Para inspecionar os bytes de uma linha específica, o macOS também inclui o od; por exemplo:
od -An -tx1 -c "my script.sh" | head
Uma sequência 0d 0a representa CRLF; 0a sozinho é LF. Não trate um retorno de carro em outro local do arquivo como uma quebra de linha sem verificar sua posição.
Converta CRLF para LF sem sobrescrever o original
As orientações da Apple para o macOS observam que o dos2unix não está incluído no macOS e recomendam o uso de tr ou sed em seu lugar. Para um script CRLF, remova os caracteres de retorno de carro para um arquivo separado, mantendo o original como backup:
cp -p "my script.sh" "my script.sh.bak"
tr -d '\r' < "my script.sh" > "my script.lf.sh"
file "my script.lf.sh"
Isso é apropriado quando os retornos de carro indesejados são caracteres de quebra de linha do Windows. Isso remove todos os bytes CR do arquivo, portanto, evite usá-lo se o arquivo utilizar intencionalmente retornos de carro como dados. A saída separada também evita truncar a entrada: redirecionar diretamente de volta para o mesmo arquivo pode apagá-lo antes que a conversão termine.
Revise o novo arquivo antes de substituir qualquer coisa. Se o conteúdo parecer correto e o file relatar quebras de linha LF, tente executá-lo com o interpretador pretendido. Para um script Bash, por exemplo:
bash "my script.lf.sh"
Executá-lo por meio do bash não requer o bit de permissão de execução nem um shebang funcional. Se precisar executá-lo diretamente como ./my script.lf.sh, torne-o executável e certifique-se de que sua primeira linha especifique um interpretador disponível, como #!/bin/bash:
chmod +x "my script.lf.sh"
"./my script.lf.sh"
Depois de verificar o arquivo reparado, você pode substituir o original no Finder ou no Terminal. Mantenha a cópia .bak até que o script funcione como pretendido. Se o script fizer parte de um projeto compartilhado, faça a mesma correção de quebras de linha no editor de código ou no fluxo de trabalho do repositório para que o problema não retorne quando o arquivo for salvo novamente.
Se o erro persistir
Se o file já mostrou LF, ou se a conversão não corrigiu a falha, leia o erro exato e verifique o interpretador indicado na primeira linha. Um interpretador ausente, caminho inválido, erro de sintaxe ou falta de permissão de execução podem produzir falhas semelhantes. O script também pode depender de comandos ou recursos do shell não disponíveis no interpretador que ele especifica.
O Editor de Texto (TextEdit) pode abrir e salvar documentos de texto sem formatação, mas o guia documentado da Apple para o TextEdit não descreve um seletor de quebra de linha. Para este reparo, use a conversão pelo Terminal acima ou um editor de código que mostre explicitamente e permita alterar as quebras de linha; verifique o arquivo salvo depois. Guia do Editor de Texto da Apple
A sequência útil é: identificar o formato do arquivo, preservar um backup, converter apenas quando o CRLF estiver presente e executar novamente usando o interpretador pretendido. Isso mantém a correção específica para o arquivo em vez de alterar scripts não relacionados.
Fontes
Designing Scripts for Cross-Platform Deployment — Apple Developer
Crie, abra e converta documentos no Editor de Texto do Mac — Suporte da Apple