Bash ou KornShell (ksh)? [fermé]
je ne suis pas nouvelle pour *nix, toutefois, dernièrement, j'ai passé beaucoup de temps à l'invite de commandes. Ma question Est de savoir quels sont les avantages de L'utilisation de KornShell (ksh) ou de Bash Shell? Où sont les pièges de l'aide de l'un sur l'autre?
cherche à comprendre du point de vue d'un utilisateur, plutôt que purement scripting.
12 réponses
Bash.
les différentes implémentations UNIX et Linux ont différentes implémentations au niveau des sources de ksh, dont certaines sont de véritables ksh, certaines sont des implémentations pdksh et certaines ne sont que des liens symboliques vers un autre shell qui a une personnalité" ksh". Cela peut conduire à des différences étranges dans le comportement d'exécution.
au moins avec bash vous pouvez être sûr que c'est une base de code unique, et tout ce dont vous avez besoin de vous soucier est ce que (généralement minimum) la version de bash est installée. Ayant fait beaucoup de scripts sur à peu près tous les UNIX modernes (et pas-si-modernes), programmer bash est plus fiable et cohérent d'après mon expérience.
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 courant. Faire la même chose à Kornshell, c'est hackish.
- Kornshell a des tableaux associatifs et BASH non. 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 de boucle. Vous pouvez habituellement définir une valeur dans une boucle de Kornshell et la rendre disponible après la boucle.
- poignées Bash obtenir les codes de sortie des tuyaux d'une manière plus propre.
- Kornshell a la commande
print
qui est bien meilleure que la commandeecho
. - Bash a tab completions. Dans les versions plus anciennes
- Kornshell a la commande
r
histoire qui permet j'ai rapidement réexécuter les anciennes commandes. - Kornshell a la syntaxe
cd old new
qui remplaceold
parnew
dans votre répertoire et CD là-bas. C'est pratique quand vous avez sont dans un répertoire appelé/foo/bar/barfoo/one/bar/bar/foo/bar
et vous devez cd à/foo/bar/barfoo/two/bar/bar/foo/bar
dans Kornshell, vous pouvez simplement fairecd one two
et être fait avec elle. À BASH, il faudraitcd ../../../../../two/bar/bar/foo/bar
.
je suis un vieux type de Kornshell parce que J'ai appris Unix dans le Les années 1990, et c'était la coquille de choix à l'époque. Je peux utiliser Bash, mais je suis frustré par cela parfois parce que dans habitude j'utilise une caractéristique mineure que Kornshell a que BASH ne fait pas et il 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 devez faire quelque chose d'exotique à BASH, vous pouvez aller sur Stackoverflow, postez votre question, et vous obtiendrez une douzaine de réponses dans quelques minutes -- et certaines d'entre elles seront même correctes!.
si vous avez une question de Kornshell et la postez sur Stackoverflow, vous devrez attendre que certains vieux passé leur premier hacker comme moi Se réveiller de sa sieste avant d'obtenir une réponse. Et, oubliez toute réponse s'ils servent du pudding dans la maison de retraite ce jour-là.
BASH est simplement la coquille de choix maintenant, donc si vous avez à apprendre quelque chose, pourrait aussi bien aller avec ce qui est populaire.
je suis un korn-shell vétéran, donc je sais que je parle à partir de ce point de vue.
cependant, je suis à l'aise avec Bourne shell, ksh88, et ksh93, et je sais quelles fonctionnalités sont prises en charge dans lequel.
pour une utilisation interactive, prenez tout ce qui vous convient. Expérience. J'aime pouvoir utiliser le même shell pour une utilisation interactive et pour la programmation.
je suis allé de ksh88 sur SVR2 à tcsh, à ksh88sun (ajoutée significative soutien à l'internationalisation) et ksh93. J'ai essayé bash, et j'ai détesté parce que
il aplatie mon histoire. Puis j'ai découvert shopt -s lithist
et tout allait bien.
(L'option lithist
assure que les lignes sont préservées dans votre commande
histoire.)
pour la programmation shell, je recommande sérieusement ksh93 si vous voulez un langage de programmation cohérent, une bonne conformité POSIX, et de bonnes performances, comme beaucoup de commandes unix communes peuvent le faire être disponible en tant que fonctions internes.
Si vous voulez la portabilité utiliser au moins deux. Et assurez-vous d'avoir une bonne suite de test.
il existe de nombreuses différences subtiles entre les coquilles. Considérons 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 des coquilles différentes. Le Korn-shell exploite les pipelines de l'arrière vers l'avant; le dernier élément du pipeline fonctionne dans le processus actuel.
autre exemple illustrant la cohérence: La commande echo
elle-même, qui a été rendue obsolète par la division entre BSD et SYSV unix, et chacun a introduit sa propre convention pour ne pas imprimer de nouvelles lignes (et d'autres comportements). Le résultat peut encore être vu dans de nombreux scripts 'configure'.
Ksh a adopté une approche radicale à cet égard - et a introduit la commande print
, qui supporte réellement les deux méthodes (l'option -n
de BSD, et le caractère spécial \c
de SYSV)
Cependant, pour la programmation de systèmes sérieux, je recommande autre chose qu'un shell, comme python, perl. Ou allez un peu plus loin, et utilisez une plate - forme comme puppet-qui vous permet de regarder et de corriger l'état de groupes entiers de systèmes, avec un bon audit.
programmer des obus, c'est comme nager dans des eaux inconnues, ou pire.
la programmation dans n'importe quelle langue exige une familiarité avec sa syntaxe, ses interfaces et comportement. La programmation Shell n'est pas différente.
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 son support pour le globbing de fichiers très puissant, les modificateurs d'expansion variables et 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 /
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 vi et J'utilise presque Solaris pour tout.
pour les scripts, j'utilise toujours ksh parce qu'il lisse au-dessus de gotchas .
mais je trouve bash plus confortable pour une utilisation interactive. Pour moi, les emacs les reliures de clé et l'achèvement de tab sont les principaux avantages. Mais c'est surtout la force de l'habitude, pas de problème technique avec ksh .
@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 de L'interpréteur de commandes Bourne original ou de l'écrire dans quelque chose comme perl
.
, Ma réponse serait "choisissez-en un et apprenez à l'utiliser". Ce sont deux coquillages décents; bash a probablement plus de cloches et de sifflets, mais ils ont tous les deux les caractéristiques de base que vous voudrez. bash est plus universellement disponible de nos jours. Si vous utilisez Linux tout le temps, il suffit de s'y tenir.
si vous programmez, essayer de s'en tenir à 'sh' simple pour la portabilité est une bonne pratique, mais alors avec bash disponible si largement ces jours - ci que peu de conseils est probablement un peu à l'ancienne.
Apprenez à utiliser completion et votre histoire shell; lisez la page de manuel de temps en temps et essayer d'apprendre quelques nouvelles choses.
disponible dans la plupart des systèmes UNIX, ksh est standard-comliant, clairement conçu, bien arrondi. Je pense que les livres, les aides en ksh sont suffisants et clairs, surtout le livre D'O'Reilly. Bash est une masse. Je le garde comme shell de login root Pour Linux à la maison seulement.
pour une utilisation interactive, je préfère zsh sous Linux / UNIX. J'exécute des scripts en zsh, mais je vais tester la plupart de mes scripts, des fonctions en AIX ksh cependant.
Bash est la référence, mais c'est surtout parce que vous pouvez être raisonnablement sûr qu'il est installé sur tous les *nix. Si vous prévoyez de distribuer les scripts, utilisez Bash.
Je ne peux pas vraiment aborder les différences de programmation réelles entre les shells, malheureusement.
Bash est la norme pour Linux.
Mon expérience est qu'il est plus facile de trouver de l'aide pour bash que pour ksh ou csh.