Si un script copiado desde Windows se ve normal pero macOS informa un «bad interpreter» o se comporta como si los comandos tuvieran un carácter adicional, verifique si tiene finales de línea CRLF de Windows. Las herramientas de línea de comandos de macOS esperan LF. Puede confirmar el tipo de archivo, convertir una copia con herramientas ya incluidas en macOS y luego volver a ejecutar el script reparado.
Por qué los finales de línea rompen un script en macOS
Un final de línea es un carácter (o par de caracteres) que marca el final de una línea de texto. Las herramientas de línea de comandos de macOS usan LF (\n); Windows utiliza comúnmente CRLF (\r\n). Con CRLF, el retorno de carro puede permanecer adjunto a una línea cuando un comando de Unix lo lee. Apple documenta que este carácter adicional puede causar un comportamiento inesperado en herramientas de línea de comandos y scripts. Guía de scripts de shell de Apple
Entre los indicios comunes se incluyen /bin/bash^M: bad interpreter, un mensaje de comando no encontrado que parece incluir un \r al final, o un análisis sintáctico que falla a pesar de que el script visible parece correcto. Estos síntomas pueden tener otras causas; inspeccionar el archivo es un primer paso útil, no una prueba concluyente por sí misma.
Comprobar el formato de final de línea del script
Abra Terminal, vaya a la carpeta que contiene el script e inspecciónelo con file. Ponga el nombre del archivo entre comillas para que los espacios y metacaracteres del shell se traten literalmente:
cd "$HOME/Downloads"
file "my script.sh"
Si la salida indica que el archivo tiene terminadores de línea CRLF, eso respalda el diagnóstico. Si informa LF, es posible que los finales de línea no sean la causa. La descripción del comando file de macOS puede variar, y es posible que los finales de línea mixtos no se resuman con claridad, por lo que también debe considerar el mensaje de error y el contexto del código fuente del script. Para inspeccionar los bytes de una línea específica, macOS también incluye od; por ejemplo:
od -An -tx1 -c "my script.sh" | head
Una secuencia 0d 0a representa CRLF; 0a solo es LF. No trate un retorno de carro en otra parte del archivo como un final de línea sin comprobar su posición.
Convertir CRLF a LF sin sobrescribir el original
La documentación de macOS de Apple señala que dos2unix no se incluye en macOS y recomienda usar tr o sed en su lugar. Para un script con CRLF, elimine los caracteres de retorno de carro enviando la salida a un archivo separado, conservando el original como copia de seguridad:
cp -p "my script.sh" "my script.sh.bak"
tr -d '\r' < "my script.sh" > "my script.lf.sh"
file "my script.lf.sh"
Esto es apropiado cuando los retornos de carro no deseados son caracteres de final de línea de Windows. Elimina todos los bytes CR del archivo, por lo que debe evitarlo si el archivo utiliza retornos de carro intencionadamente como datos. La salida independiente también evita truncar la entrada: redirigir directamente al mismo archivo puede borrarlo antes de que finalice la conversión.
Revise el nuevo archivo antes de reemplazar nada. Si el contenido se ve correcto y file informa finales LF, intente ejecutarlo con su intérprete previsto. Para un script de Bash, por ejemplo:
bash "my script.lf.sh"
Ejecutarlo a través de bash no requiere el bit de permiso de ejecución ni un shebang funcional. Si necesita ejecutarlo directamente como ./my script.lf.sh, hágalo ejecutable y asegúrese de que su primera línea indique un intérprete disponible, como #!/bin/bash:
chmod +x "my script.lf.sh"
"./my script.lf.sh"
Una vez que haya verificado el archivo reparado, puede reemplazar el original en Finder o Terminal. Conserve la copia .bak hasta que el script funcione como se espera. Si el script forma parte de un proyecto compartido, realice la misma corrección de finales de línea en su editor de código fuente o en el flujo de trabajo del repositorio para que el problema no vuelva a ocurrir cuando se guarde el archivo nuevamente.
Si el error persiste
Si file ya mostraba LF, o la conversión no solucionó el fallo, lea el error exacto y verifique el intérprete indicado en la primera línea. Un intérprete inexistente, una ruta no válida, un error de sintaxis o la falta de permisos de ejecución pueden generar fallos similares. El script también puede depender de comandos o funciones del shell que no están disponibles en el intérprete que especifica.
TextEdit puede abrir y guardar documentos de texto sin formato, pero la guía documentada de TextEdit de Apple no describe un selector de final de línea. Para esta reparación, utilice la conversión de Terminal indicada anteriormente o un editor de código que muestre explícitamente los finales de línea y le permita cambiarlos; verifique el archivo guardado después. Guía de TextEdit de Apple
La secuencia útil es: identificar el formato del archivo, conservar una copia de seguridad, convertir solo cuando CRLF esté presente y volver a ejecutar usando el intérprete previsto. Esto mantiene la solución específica para el archivo en lugar de modificar scripts no relacionados.
Fuentes
Designing Scripts for Cross-Platform Deployment — Apple Developer
Crear, abrir y convertir documentos en TextEdit en la Mac — Soporte técnico de Apple