Das Shell-Skript führt den Befehl cd nicht aus


15

Ich habe einen Text-basiertes Spiel, Colossal Cave Adventure, dass ich mit einem Shell - Skript starten möchte , anstatt das Terminal und Typisierung von Öffnen cd ~/Desktop/CCAund ./Adventure. Der Code, den ich versuche zu verwenden, ist dieser:

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

und die Nachricht, die ich erhalte, ist folgende:

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

mit Optionen zum Ändern der Profileinstellungen oder zum Neustarten des Prozesses. Ich habe auch versucht, stattdessen den absoluten Pfad zu verwenden ~/, und alle meine Dateinamen sind richtig geschrieben und verweisen auf die richtige Stelle. Was ist falsch?

Antworten:


16

cd ist eine eingebaute Shell. Sie sollten dies verwenden:

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

Vielen Dank, mir war nicht bewusst, dass dies cdkein Befehl war.
Giaphage47

1
cdsicherlich ist ein Befehl! Es ist ein sogenannter Shell-Built-In-Befehl , wie Hasturs Antwort richtig angibt. Shell-Builtin-Befehle werden oft als "Shell-Builtins" oder kurz "Builtins" bezeichnet, sind aber absolut Befehle. Was cdnicht ist, ist ein externer Befehl . Ubuntu hat kein cd Programm (und wenn dies der Fall ist, hat das Ausführen immer noch nicht den Effekt, dass das Verzeichnis in der Shell geändert wird, von der aus Sie es ausgeführt haben ). @ Giaphage47
Eliah Kagan

11

Der Fehler

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

entsteht, weil cdeiner der istSHELL BUILTIN COMMANDS und keine ausführbare Datei, die Sie physisch auf Ihrer Festplatte finden.

Um es oder die anderen built-inBefehle in Ihrem Skript auszuführen, müssen Sie die gesamte Zeile an einen bashAufruf übergeben

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

Wenn es keinen anderen internen Befehl gibt, den Sie ausführen müssen, können Sie das Arbeitsverzeichnis für das festlegen gnome terminal, wie gerade hier beantwortet :

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

Ad nauseam : Es gibt einige Alternativen:

Wenn Sie sich nur in einem Terminal befinden, können Sie beides tun

  • ein aliaslike
    alias Star_My_Game="cd ~/Desktop/CCA; ./Adventure "
    und setze es in dein .bashrcoder in dein, ~/.bash_aliasesdamit du es mit dem einzelnen Befehl Start_My_Gamein jeder Shell ausführen kannst, die du sein wirst.

  • oder ein Skript, das Sie ausführbar machen ( chmod u+x MYscript) und patheinfügen können (in der Regel ~/binist dies ein guter Kandidat).

Ich nehme an, Sie können einen Link auf Ihren Desktop setzen, der das Terminal ausführt und das Startverhalten ändert. Von der Gnomenhilfe

  1. Wählen Sie Bearbeiten ▸ Profileinstellungen ▸ Titel und Befehl.

  2. Aktivieren Sie "Benutzerdefinierten Befehl anstelle meiner Shell ausführen".

  3. Geben Sie in das Textfeld den Befehl oder die gewünschte Shell ein.

  4. Der Befehl wird genau so an das Terminal übergeben, wie Sie ihn schreiben, einschließlich aller von Ihnen angegebenen Argumente. Umgebungsvariablen werden vom Terminal geerbt, da es sich um einen untergeordneten Prozess des Terminals handelt.

    Öffnen Sie eine neue Registerkarte oder ein neues Terminalfenster, um zu sehen, wie die benutzerdefinierte Shell oder der benutzerdefinierte Befehl ausgeführt werden


Es ging jedoch darum, von einem Shell-Skript aus zu starten und kein Terminalfenster zu öffnen.
Giaphage47

Wenn Sie von einem Skript starten möchten, reicht ein alias(gemütlicheres) oder ein Skript in Ihrem ~ / bin-Verzeichnis aus, ohne ein neues Terminal zu starten
Hastur

Antwort aktualisiert, nur für den Fall, dass Sie es erneut benötigen: Es ist möglich, zu bestehen, cdaber Sie müssen es weitergeben bash. Probieren Sie es aus :) -
Hastur
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.