Skrypt powłoki nie uruchamia polecenia cd

15

Mam grę tekstowego, Colossal Cave Adventure, że chciałbym, aby uruchomić ze skryptu powłoki zamiast otwierania terminal i wpisując cd ~/Desktop/CCAi ./Adventure. Kod, którego próbuję użyć, jest następujący:

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

a wiadomość, którą otrzymuję, jest następująca:

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

z opcjami zmiany preferencji profilu lub ponownego uruchomienia procesu. Próbowałem również użyć ścieżki bezwzględnej zamiast ~/, a wszystkie moje nazwy plików są poprawnie przeliterowane i wskazują właściwe miejsce. Co jest nie tak?

Giaphage47
źródło

Odpowiedzi:

16

cd jest wbudowaną powłoką. powinieneś użyć tego:

#! /bin/bash
gnome-terminal --working-directory=/home/username/Desktop/CCA/ -e './Adventure'
Taher Khorshidi
źródło
Dziękuję, nie wiedziałem, że cdto nie było polecenie.
Giaphage47
1
cdz pewnością jest rozkazem! Jest to tak zwane polecenie wbudowane w powłokę , jak słusznie stwierdza odpowiedź Hastura. Polecenia wbudowane w powłokę są często nazywane „wbudowanymi powłokami” lub „wbudowanymi” w skrócie, ale są to polecenia absolutnie. To, co cdnie jest, jest poleceniem zewnętrznym . Ubuntu nie ma cd programu (a jeśli tak, to uruchomienie go nadal nie zmieniłoby katalogu w powłoce, z której go uruchomiłeś ). @ Giaphage47
Eliah Kagan
11

Błąd

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

powstaje, ponieważ cdjest to jeden z SHELL BUILTIN COMMANDSplików wykonywalnych, które fizycznie znajdują się na dysku twardym.

Aby uruchomić go lub inne built-inpolecenia w skrypcie, musisz przekazać całą linię do bashwywołania

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

Jeśli nie ma innego wewnętrznego polecenia do wykonania, możesz ustawić katalog roboczy dla gnome terminal, jak właśnie tutaj odpowiedziano :

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

Ad nauseam : istnieje kilka alternatyw:

Jeśli jesteś tylko w terminalu, możesz to zrobić

  • aliaspolub
    alias Star_My_Game="cd ~/Desktop/CCA; ./Adventure "
    i umieść go w swoim .bashrclub wewnątrz ~/.bash_aliases, abyś mógł uruchomić za pomocą jednego polecenia Start_My_Gamew każdej powłoce, którą będziesz (wygodniej jest wybrać prostszą / krótszą nazwę niż Start_My_Game ...)

  • lub skrypt, który można wykonać w pliku wykonywalnym ( chmod u+x MYscript) i wstawić do niego path(typowo ~/binjest dobrym kandydatem).

Podejrzewam, że możesz umieścić link na pulpicie, który uruchamia terminal i zmodyfikować zachowanie początkowe. Z pomocy gnome

  1. Wybierz Edytuj ferences Preferencje profilu ▸ Tytuł i polecenie.

  2. Zaznacz Uruchom niestandardowe polecenie zamiast mojej powłoki.

  3. W polu tekstowym wpisz polecenie lub żądaną powłokę.

  4. Polecenie zostanie przekazane do terminala dokładnie tak, jak piszesz, wraz z podanymi argumentami. Zmienne środowiskowe zostaną odziedziczone z terminala, ponieważ jest to proces potomny terminala.

    Otwórz nową kartę lub okno terminala, aby zobaczyć, jak działa niestandardowa powłoka lub polecenie

Hastur
źródło
Chodziło o to, aby uruchomić ze skryptu powłoki i nie trzeba było otwierać okna terminala.
Giaphage47
Jeśli chcesz uruchomić ze skryptu, wystarczy alias(bardziej przytulny) lub skrypt w katalogu ~ / bin, bez uruchamiania nowego terminalu
Hastur
Odpowiedź została zaktualizowana na wszelki wypadek: możesz przekazać, cdale musisz ją przekazać bash. Sprawdź to :) -
Hastur