2009-07-24 9 views
4

J'ai un script bash que je édite sur Windows en utilisant UltraEdit et enregistrer comme UTF-8 No BOM, en utilisant le style Unix Line Terminator, comme spécifié dans la boîte de dialogue "Enregistrer sous" dans UE. Je le télécharge ensuite sur une machine centos 5 x86 exécutant des parallèles virtuozzo, et à chaque fois, peu importe comment je l'ai téléchargé (FTP en tant que fichier binaire, ou via la console de gestion des parallèles), le script ne fonctionnera pas. Quand je regarde le script via la console de gestion des parallèles, je vois que le DERNIER, et seulement la dernière ligne, a un caractère étrange. Si je supprime le terminateur de ligne de la dernière ligne (que le script se termine au dernier caractère imprimable) tout fonctionne correctement.Newline Madness dans Script Bash

Mes questions:

A) Pourquoi est que la terminaison de la dernière ligne à l'origine des problèmes?

B) comment éviter cela dans le futur?

merci!

Répondre

1

J'ai utilisé CTRL-H sur Ultraedit, qui affiche la même sortie que la commande XXD d'unix, et j'y vois le 0D 0A, bien que le fichier soit configuré pour utiliser les terminaisons de ligne UNIX. C'est un problème d'Ultraedit. Im en utilisant v 13.20a.

Je suis nouveau sur stackoverflow. devrais-je ouvrir une nouvelle question ou re-tagger celle-ci?

merci à tous

+1

Pas besoin de créer une nouvelle question .. il suffit de modifier celui-ci avec vos mises à jour. –

2

tout d'abord je vous recommande de transférer en binaire .. puisque vous semblez savoir exactement le format que vous voulez ..

ASCII/texte FTP est connu pour faire la conversion de fin de ligne lorsque vous ne voulez pas trop.

+0

si tel était le problème, il wouldnt arriver quand je transfert via PMC. sauf si PMC utilise un transfert basé sur FTP et que je ne connais pas ... – Gaia

+0

de transfert en tant que binaire ne corrige pas, comme prévu. voir les commentaires à la réponse des sinans. – Gaia

1

L'étape suivante consiste à faire un hexdump sur le fichier et à voir ce qu'il y a dedans. Cela ressemble beaucoup à une CR pure. Rappelez-vous que les moyens de retour chariot "écrire le caractère suivant dans la position 0 de la ligne en cours". Essayez d'exécuter hexdump -C file ou même od -t x1 file et recherchez 0A et 0D (0D = CR, 0A = LF).

+0

c'est un CR thats là dedans (^ M) le problème est comment est-il arrivé là? Je suis en train de tuer tous les trucs de la dernière ligne, puis j'insère une nouvelle ligne et enregistre le fichier, comme indiqué ci-dessus. – Gaia

+0

od -t x1 retourne le fichier 0000000 23 21 2f 62 69 6e 2f 62 61 73 68 0d 0a 0000015 – Gaia

2

vous pouvez simplement lancer dos2unix pour se débarrasser d'eux ..

+0

J'ai lancé le script perl parce que dos2unix ne semble pas être disponible sur ma distribution? – Gaia

+0

-bash: dos2unix: commande non trouvée – Gaia

+0

Tout d'abord, vous pouvez généralement dire "fichier filename" pour identifier quand le fichier a des terminateurs de ligne CRLF de type DOS. Ensuite, si vous n'avez pas 'dos2unix' vous pouvez l'obtenir sous de nombreuses formes en ligne pour votre plate-forme. – nik

2

Il y a deux questions: Premièrement, en supposant que l'éditeur enregistre avec des fins de ligne Unix, vous devez utiliser FTP binaire, non ASCII. Deuxièmement, et cela est déroutant, l'éditeur semble insérer un CTRL-Z à la fin du fichier (ce qui n'a pas été nécessaire depuis la fin des années quatre-vingt AFAIK).

Faites enregistrer un fichier constitué d'une seule ligne, transférer au système Unix par des moyens habituels et de l'utilisation:

xxd myscript.sh 

pour voir si le dernier octet dans le fichier est 0x1a pour vérifier si ma théorie est correct.

+0

script d'une ligne transférée sous forme binaire rapporté '0000000: 2321 2f62 696e 2f62 6173 68 #/bin/bash' – Gaia

+0

deux retourne ligne '0000000: 2321 2f62 696e 2f62 6173 680D 0a #/bin/bash ..' – Gaia

+0

essayer d'exécuter la ligne deux montre le CR supplémentaire. c'est mon problème. -bash: ./hello.sh:/bin/bash^M: mauvais interprète: Aucun fichier ou répertoire (désolé je ne peux pas obtenir le backtick droite sur un international kbd) – Gaia

0

vous pouvez simplement modifier le script à distance.

emacs/vim/nano etc. fonctionne bien sur le mastic. Si vous aimez emacs, vous pouvez également utiliser le clochard pour éditer des fichiers distants avec les emacs fonctionnant sur n'importe quelle machine devant laquelle vous êtes assis, bien que je n'ai pas utilisé clochard avec windows. komodo-edit comme édition à distance, et bien que je recommande fortement komodo-edit, je n'ai pas utilisé la fonction à distance.

+0

bien sûr, mais j'essaie de savoir ce que est faux avec ma méthode actuelle. ça * devrait * fonctionner. merci – Gaia

2

j'ai eu un problème similaire avec la nomenclature (octet de marque d'ordre) étant mis en Ultraedit sur tous les nouveaux fichiers enregistrés, même si j'avais cette option décochée. Cela a fait des ravages sous Linux. La solution consistait à définir le codage par défaut sur ANSII. Ce paramètre est au moins dans UltraEdit v18.

Avancé> Configuration> Editeur> Création d'un nouveau fichier

type d'encodage: Créer de nouveaux fichiers comme ANSII