web-dev-qa-db-fra.com

Bash ou KornShell (ksh)?

Je ne suis pas nouveau sur * nix, mais dernièrement, j'ai passé beaucoup de temps au Prompt. Ma question est quels sont les avantages d'utiliser KornShell (ksh) ou Bash Shell? Quels sont les pièges de l'utilisation de l'un au-dessus de l'autre?

Vous cherchez à comprendre du point de vue d'un utilisateur, plutôt que de simples scripts.

59
user13158

Frapper.

Les différentes implémentations UNIX et Linux ont différentes implémentations de niveau source différentes de ksh, dont certaines sont de véritables ksh, dont certaines sont des implémentations pdksh et certaines sont simplement des liens symboliques vers un autre Shell qui a une personnalité "ksh". Cela peut entraîner des différences étranges dans le comportement d'exécution.

Au moins avec bash, vous pouvez être sûr qu'il s'agit d'une base de code unique, et tout ce dont vous avez besoin, c'est de savoir quelle version (généralement minimale) de bash est installée. Ayant fait beaucoup de scripts sur à peu près tous les UNIX modernes (et pas si modernes), la programmation de bash est plus fiable dans mon expérience.

46
j.e.hahn

La différence entre Kornshell et Bash est minime. Il y a certains avantages l'un par rapport à l'autre, mais les différences sont minimes:

  • BASH est beaucoup plus facile à définir une invite qui affiche le répertoire actuel. Faire la même chose dans Kornshell est hackish.
  • Kornshell a des tableaux associatifs et BASH n'en a pas. Maintenant, la dernière fois que j'ai utilisé des tableaux associatifs, c'était ... Laissez-moi réfléchir ... Jamais.
  • Kornshell gère un peu mieux la syntaxe des boucles. Vous pouvez généralement définir une valeur dans une boucle Kornshell et la rendre disponible après la boucle.
  • Bash gère l'obtention des codes de sortie des tuyaux de manière plus propre.
  • Kornshell a la commande print qui est bien meilleure que la commande echo.
  • Bash a des tabulations terminées. Dans les anciennes versions
  • Kornshell a la commande d'historique r qui me permet de réexécuter rapidement des commandes plus anciennes.
  • Kornshell a la syntaxe cd old new qui remplace old par new dans votre répertoire et vos CD là-bas. C'est pratique lorsque vous avez dans un répertoire appelé /foo/bar/barfoo/one/bar/bar/foo/bar et vous devez enregistrer sur /foo/bar/barfoo/two/bar/bar/foo/bar Dans Kornshell, vous pouvez simplement faire cd one two et en finir. En BASH, vous devez cd ../../../../../two/bar/bar/foo/bar.

Je suis un vieil homme de Kornshell parce que j'ai appris Unix dans les années 1990, et c'était le Shell de choix à l'époque. Je peux utiliser Bash, mais je suis parfois frustré parce que d'habitude j'utilise une fonctionnalité mineure que Kornshell a que BASH n'a pas et cela ne fonctionne pas. Donc, dans la mesure du possible, j'ai défini Kornshell comme valeur par défaut.

Cependant, je vais vous dire d'apprendre BASH. Bash est maintenant implémenté sur la plupart des systèmes Unix ainsi que sur Linux, et il y a simplement plus de ressources disponibles pour apprendre BASH et obtenir de l'aide que Kornshell. Si vous avez besoin de faire quelque chose d'exotique en BASH, vous pouvez aller sur Stackoverflow, posez votre question, et vous obtiendrez une douzaine de réponses en quelques minutes - et certaines d'entre elles seront même correctes!.

Si vous avez une question sur Kornshell et que vous la postez sur Stackoverflow, vous devrez attendre qu'un ancien passé leur hacker principal comme moi se réveille de sa sieste avant d'obtenir une réponse. Et, oubliez de recevoir une réponse s'ils servent du pudding dans la maison de retraite ce jour-là.

BASH est tout simplement le Shell de choix maintenant, donc si vous devez apprendre quelque chose, autant aller avec ce qui est populaire.

122
David W.

Je suis un vétéran de Korn-Shell, alors sachez que je parle de ce point de vue.

Cependant, j'ai été à l'aise avec Bourne Shell, ksh88 et ksh93, et pour la plupart, je sais quelles fonctionnalités sont prises en charge dans quel. (Je devrais ignorer ksh88 ici, car il n'est plus largement distribué.)

Pour une utilisation interactive, prenez ce qui vous convient. Expérience. J'aime pouvoir utiliser le même Shell pour une utilisation interactive et pour la programmation.

Je suis passé de ksh88 sur SVR2 à tcsh, à ksh88Sun (qui a ajouté un support d'internationalisation important) et ksh93. J'ai essayé bash et je détestais ça parce que ça aplatissait mon histoire. Puis j'ai découvert shopt -s lithist et tout allait bien. (L'option lithist garantit que les sauts de ligne sont conservés dans l'historique de vos commandes.)

Pour la programmation Shell, je recommanderais sérieusement ksh93 si vous voulez un langage de programmation cohérent, une bonne conformité POSIX et de bonnes performances, car de nombreuses commandes Unix courantes peuvent être disponibles en tant que fonctions intégrées.

Si vous voulez la portabilité, utilisez au moins les deux. Et assurez-vous d'avoir une bonne suite de tests.

Il existe de nombreuses différences subtiles entre les coquilles. Considérez par exemple la lecture d'un tuyau:

b=42 && echo one two three four |
    read a b junk && echo $b

Cela produira des résultats différents dans différents obus. Le korn-Shell fait fonctionner les pipelines de l'arrière vers l'avant; le dernier élément du pipeline s'exécute dans le processus en cours. Bash ne supportait pas ce comportement utile jusqu'à la v4.x, et même alors, ce n'est pas la valeur par défaut.

Autre exemple illustrant la cohérence: la commande echo elle-même, rendue obsolète par la séparation entre BSD et SYSV unix, et chacune a introduit sa propre convention pour ne pas imprimer les retours à la ligne (et autres comportements). Le résultat de ceci peut encore être vu dans de nombreux scripts de "configuration".

Ksh a adopté une approche radicale à ce sujet - et a introduit la commande print, qui prend en charge les deux méthodes (le -n option de BSD et le dernier \c caractère spécial de SYSV)

Cependant, pour une programmation système sérieuse, je recommanderais autre chose qu'un Shell, comme python, Perl. Ou allez plus loin et utilisez une plate-forme comme marionnette - qui vous permet de surveiller et de corriger l'état de grappes entières de systèmes, avec un bon audit.

La programmation de Shell est comme nager dans des eaux inexplorées, ou pire.

La programmation dans n'importe quel langage nécessite une connaissance de sa syntaxe, de ses interfaces et de son comportement. La programmation Shell n'est pas différente.

28
Henk Langeveld

C'est un peu une bataille Unix vs Linux. La plupart sinon toutes les distributions Linux ont bash installé et ksh en option. La plupart des systèmes Unix, comme Solaris, AIX et HPUX ont ksh par défaut.

Personnellement, j'utilise toujours ksh, j'aime l'achèvement de vi et j'utilise à peu près Solaris pour tout.

4
Kristian

Pour les scripts, j'utilise toujours ksh car il lisse sur gotchas .

Mais je trouve bash plus confortable pour une utilisation interactive. Pour moi, les raccourcis clavier emacs et l'achèvement des tabulations sont les principaux avantages. Mais c'est surtout une force d'habitude, pas un problème technique avec ksh .

4
Jon Ericson

Je n'ai pas d'expérience avec ksh, mais j'ai utilisé à la fois bash et zsh. Je préfère zsh à bash en raison de sa prise en charge de la globalisation de fichiers très puissante, des modificateurs d'extension variables et de l'achèvement plus rapide des onglets.

Voici une introduction rapide: http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-Shell-youll-ever-need/

4
Chris AtLee

Ma réponse serait "choisissez-en un et apprenez à l'utiliser". Ce sont deux coquilles décentes; bash a probablement plus de cloches et de sifflets, mais ils ont tous les deux les fonctionnalités de base que vous voudrez. bash est plus universellement disponible de nos jours. Si vous utilisez Linux tout le temps, respectez-le.

Si vous programmez, essayer de s'en tenir à `` sh '' pour la portabilité est une bonne pratique, mais avec bash disponible si largement ces jours-ci, ce conseil est probablement un peu démodé.

Apprenez à utiliser l'achèvement et votre historique Shell; lisez la page de manuel de temps en temps et essayez d'apprendre quelques nouvelles choses.

3
Incident

@foxxtrot

En fait, le shell standard est Bourne Shell (sh). /bin/sh sur Linux est en fait bash, mais si vous visez des scripts multiplateformes, vous feriez mieux de vous en tenir aux fonctionnalités du Bourne Shell d'origine ou de l'écrire dans quelque chose comme Perl .

3
Hank Gay

D'une part, bash a une tabulation terminée. Cela suffit à lui seul pour que je le préfère à ksh.

Z Shell a une bonne combinaison des fonctionnalités uniques de ksh avec les belles choses que bash fournit, ainsi que beaucoup plus de choses en plus.

2
Allen

Disponible dans la plupart des systèmes UNIX, ksh est conforme aux normes, clairement conçu et bien arrondi. Je pense que les livres, l'aide dans ksh est suffisant et clair, en particulier le livre O'Reilly. Bash est une masse. Je le garde en tant que shell de connexion root pour Linux à la maison uniquement.

Pour une utilisation interactive, je préfère zsh sous Linux/UNIX. J'exécute des scripts dans zsh, mais je vais tester la plupart de mes scripts, mais des fonctions dans AIX ksh.

2
MeaCulpa