Le script shell n'exécute pas la commande cd


15

J'ai un jeu textuel, Colossal Cave Adventure, que je voudrais lancer avec un script shell au lieu d'ouvrir le terminal et de taper cd ~/Desktop/CCAet ./Adventure. Le code que j'essaie d'utiliser est le suivant:

#! /bin/bash
gnome-terminal -e 'cd ~/Desktop/CCA/; ./Adventure'

et le message que je reçois est le suivant:

There was an error creating the child process for this terminal
Failed to execute child process `cd` (No such file or directory)

avec des options pour modifier les préférences de profil ou relancer le processus. J'ai également essayé d'utiliser le chemin absolu au lieu de ~/, et tous mes noms de fichiers sont correctement orthographiés et pointent au bon endroit. Qu'est-ce qui ne va pas?

Réponses:


16

cd est un shell intégré. vous devez utiliser ceci:

#! /bin/bash
gnome-terminal --working-directory=/home/username/Desktop/CCA/ -e './Adventure'

Merci, je ne savais pas que ce cdn'était pas une commande.
Giaphage47

1
cdest certainement une commande! C'est ce qu'on appelle une commande intégrée au shell , comme l' indique correctement la réponse de Hastur . Les commandes intégrées du shell sont souvent appelées "intégrées au shell" ou "intégrées" pour faire court, mais ce sont absolument des commandes. Ce qui cdne l'est pas, c'est une commande externe . Ubuntu n'a pas de cd programme (et s'il le faisait, son exécution n'aurait toujours pas pour effet de changer le répertoire dans le shell à partir duquel vous l'avez exécuté ). @ Giaphage47
Eliah Kagan

11

L'erreur

Failed to execute child process "cd" (No such file or directory)

survient car cdest l'un des SHELL BUILTIN COMMANDSet non un exécutable que vous trouvez physiquement sur votre disque dur.

Pour l'exécuter ou les autres built-incommandes de votre script, vous devez passer toute la ligne à une bashinvocation

 gnome-terminal -e '/bin/bash -c "cd ~/Desktop/CCA/; ./Adventure" '   

S'il n'y a aucune autre commande interne que vous devez exécuter, vous pouvez définir le répertoire de travail pour le gnome terminal, comme il vient d'être répondu ici :

gnome-terminal --working-directory=/home/username/Desktop/CCA/ -e './Adventure'

Ad nauseam : il existe des alternatives:

Si vous êtes juste dans un terminal, vous pouvez soit faire

  • un aliaslike
    alias Star_My_Game="cd ~/Desktop/CCA; ./Adventure "
    et mettez-le dans votre .bashrcou dans ~/.bash_aliasespour que vous puissiez exécuter la commande unique Start_My_Gamedans chaque shell que vous serez (il est plus confortable de choisir un nom plus simple / court que Start_My_Game ...)

  • ou un script que vous pouvez rendre exécutable ( chmod u+x MYscript) et mettre dans votre path( ~/binest typiquement un bon candidat).

Je suppose que vous pouvez mettre un lien sur votre bureau qui exécute le terminal et modifie le comportement de démarrage. De l'aide gnome

  1. Sélectionnez Édition Prefer Préférences de profil ▸ Titre et commande.

  2. Cochez Exécuter une commande personnalisée au lieu de mon shell.

  3. Dans la zone de texte, tapez la commande ou le shell souhaité.

  4. La commande sera transmise au terminal exactement comme vous l'écrivez, y compris tous les arguments que vous spécifiez. Les variables d'environnement seront héritées du terminal car il s'agit d'un processus enfant du terminal.

    Ouvrez un nouvel onglet ou une nouvelle fenêtre de terminal pour voir comment le shell ou la commande personnalisée s'exécute


Mais il s'agissait de lancer à partir d'un script shell, et de ne pas avoir à ouvrir une fenêtre de terminal.
Giaphage47

Si vous voulez lancer à partir d'un script suffit un alias(plus confortable) ou un script dans votre répertoire ~ / bin, sans lancer un nouveau terminal
Hastur

Réponse mise à jour juste au cas où vous en auriez besoin à nouveau: il est possible de passer cdmais vous devez le passer à bash. Donnez-lui un chèque :) -
Hastur
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.