Créer un shell personnalisé

J’ai créé un shell personnalisé en C ++. Actuellement, le shell est conçu comme une boucle while infinie qui est lancée en exécutant l’exécutable correspondant depuis le terminal (j’utilise Ubuntu comme système d’exploitation). Le shell implémente quelques nouvelles commandes qui sont chacune stockées en tant qu’exécutables distincts dans le système de fichiers. Le rest des commandes saisies par l’utilisateur est exécuté directement à l’aide de la fonction wrapper execve() .

Donc, essentiellement, j’exécute toutes les commandes utilisateur en utilisant la fonction execve (): les commandes personnalisées sont stockées en tant qu’exectuables séparés et sont ” exec ed” en fournissant le chemin de l’exécutable alors que toute autre commande unix “standard” est directement exec ed.

Au lieu de l’exécuter en tant qu’exécutable séparé de bash , je veux que l’utilisateur utilise mon shell qui s’exécute sur le terminal . Comment puis je faire ça?

J’ai fait référence aux liens suivants:

Processus et sessions et contrôle des terminaux

Créer un shell UNIX

Cependant, je suis incapable de comprendre les liens comme l’association entre un terminal de contrôle et le shell, etc. Toute aide serait appréciée à cet égard.

METTRE À JOUR:

Cela peut sembler un peu illogique mais:

Est-il possible de l’implémenter comme une commande utilisateur que l’utilisateur peut exécuter à partir du shell actuel? Je sais qu’il existe une commande appelée chsh … mais est-ce que cela fonctionnera avec mon shell?

Tout d’abord, vous pouvez tester votre shell depuis bash avec exec yourshell . Cela remplace entièrement le processus bash avec votre shell. (Lorsque vous quittez votre shell, le terminal quitte / se déconnecte avec lui.)

Vous pouvez également exécuter xterm -e yourshell pour démarrer un xterm avec votre shell au lieu de bash.

Si vous voulez en faire de manière permanente votre shell par défaut:

  1. Ajoutez votre shell à la liste des shells du système, /etc/shells
  2. Changer le shell de connexion de votre utilisateur avec chsh
  3. Déconnectez-vous et à nouveau