Quelqu'un peut-il me dire comment trouver le chemin d'accès du KornShell (ksh) sur ma machine et ensuite changer la ligne d'interpréteur dans tous les scripts shell (.sh) dans le courant répertoire qui montre un chemin d'accès différent pour ksh?UNIX, modifier la ligne d'interpréteur dans tous les scripts shell
Répondre
Cela vous donnera le chemin d'accès shell Korn:
which ksh
Et cela remplacera tralala dans tous les scripts shell:
sed -i 's/#!\/bin\/bash/#!insert escaped ksh path here/' *.sh
Mettre cela dans la première ligne de chaque fichier (ligne tralala):
#!/usr/bin/env ksh
Si vous devez remplacer vous pouvez utiliser sed/awk: find -name '*.sh' | xargs perl -pi -e "s{^#!/usr/bin/sh}{#!/usr/bin/env ksh}"
Qu'est-ce que c'est que ça? –
Supprimé. C'est à partir d'un extrait que j'ai trouvé qui cherchait des fichiers .pl ET .cgi. Merci de l'avoir attrapé. –
Pour savoir où vit ksh:
whence -a ksh
Pour modifier tous les scripts shell dans le répertoire courant à utiliser ksh:
Cela correspond aux sh
ou bash
et de préserver tous les espaces (et arguments) qui apparaissent après. Il agit uniquement sur la première ligne afin qu'il ne touche pas les lignes similaires qui peuvent apparaître plus tard dans le fichier.
Substituez l'emplacement réel de votre exécutable ksh ou utilisez /usr/bin/env ksh
. Utilisez sed -i .bak
si vous souhaitez sauvegarder les fichiers modifiés.
Cette commande localisera l'exécutable korn shell dans votre environnement UNIX:
which ksh
Si aucune sortie est renvoyée, le korn shell est manquant. (Au moins ne pas trouvé dans votre environnement PATH.) Vous pouvez l'obtenir à partir du site KornShell ou l'installer via votre système de gestionnaire de paquets logiciels.
Pour remplacer la ligne d'interprète dans tous les scripts shell (* .sh), vous pouvez exécuter quelque chose comme ceci:
sed -i "s/^#\!.*$/#\!\/bin\/ksh/" *.sh
L'option -i
est d'éditer des fichiers en place. (Avertissement: Testez d'abord cette commande sans le -i
, pour éviter les modifications de fichier.)
L'argument indiqué est le motif qui correspond à toutes les lignes commençant par "#!" et remplacez-les par "#!/bin/ksh". (Notez que certains caractères spéciaux doivent être échappés avec "\" avant.) Vous devrez peut-être personnaliser cet argument si ce n'est pas exactement le remplacement que vous recherchez.
D'une manière ou d'une autre, j'obtiens une erreur: nom de variable non valide. Mais cela fonctionne: 'sed -i 's /^#\!.*$/#!\/ bin \/ksh /' * .sh' – danger89
Sur ma machine seulement cela fonctionne sed -i "s/^#\!.*/#\!\/usr\/bin\/perl/" *.sh
Everyother jette une erreur.
Peut-être vaut-il la peine de noter qu'il doit échapper à la corde qu'il insère. Mieux encore, je suppose qu'il est préférable d'utiliser quelque chose comme: 'echo 1/23 | sed 's ^/^ 2 ^''. De plus, vous n'avez pas besoin de '/ g', car il est à espérer qu'un seul par ligne ...:) –