Скрипт Shell не запускає CD-команду


15

У мене є текстова гра «Colossal Cave Adventure», яку я хотів би запустити зі скриптом оболонки замість того, щоб відкривати термінал і набирати cd ~/Desktop/CCAта ./Adventure. Я намагаюся використовувати такий код:

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

і повідомлення, яке я отримую таке:

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

з опціями зміни налаштувань профілю або відновлення процесу. Я також спробував використовувати абсолютний шлях замість ~/, і всі мої імена файлів правильно написані і вказують на потрібне місце. Що не так?

Відповіді:


16

cd є вбудованою оболонкою. ви повинні використовувати це:

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

Дякую, я не знав, що cdце не команда.
Giaphage47

1
cdбезумовно , це команда! Це те, що відомо як команда , побудована в оболонці , як вірно говориться у відповіді Гастура. Команди вбудованих оболонок часто називають "вбудованими оболонками" або "вбудованими", але вони абсолютно команди. Що cdні, це зовнішня команда . У Ubuntu немає cd програмиякби це було, запуск його все одно не призведе до зміни каталогу в оболонці, з якої ви його запустили ). @ Giaphage47
Kagan

11

Помилка

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

виникає через те, що cdце один із SHELL BUILTIN COMMANDSвиконуваних файлів, а не їх виконанням, який ви фізично знаходите на своєму жорсткому диску.

Щоб запустити його чи інші built-inкоманди в сценарії, вам потрібно передати весь рядок до bashвиклику

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

Якщо немає іншої внутрішньої команди, яку потрібно виконати, ви можете встановити робочий каталог для gnome terminal, як тільки тут відповіли :

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

Рекламна нудота : є кілька альтернатив:

Якщо ви просто в терміналі, ви можете це зробити

  • aliasяк
    alias Star_My_Game="cd ~/Desktop/CCA; ./Adventure "
    і покласти його в .bashrcабо ~/.bash_aliasesтак , що ви будете мати можливість працювати з однією командою Start_My_Gameв кожній оболонці ви будете (Це затишніше вибрати простий / коротке ім'я , ніж Start_My_Game ...)

  • або сценарій, який ви можете зробити виконуваним ( chmod u+x MYscript) і помістити у свій path(типово ~/bin, це хороший кандидат).

Я припускаю, що ви можете покласти на робочий стіл посилання, яке виконує термінал і змінює стартову поведінку. Від допомоги гнома

  1. Виберіть Правка ference Налаштування профілю ▸ Назва та команда.

  2. Поставте прапорець Запустити власну команду замість моєї оболонки.

  3. У текстовому полі введіть команду або потрібну оболонку.

  4. Команда буде передана терміналу саме так, як ви її записуєте, включаючи будь-які вказані вами аргументи. Змінні середовища будуть успадковані від терміналу, оскільки це дочірній процес терміналу.

    Відкрийте нову вкладку або вікно терміналу, щоб побачити, як виконується власна оболонка або команда


Але сенс полягав у запуску із сценарію оболонки, а не в тому, щоб відкривати вікно терміналу.
Giaphage47

Якщо ви хочете запустити сценарій, достатньо alias(більш затишний) або скрипт у вашому каталозі ~ / bin, без запуску нового терміналу
Hastur

Відповідь оновлюється про всяк випадок, коли вам потрібно знову: можна пройти, cdале вам потрібно передати його bash. Дайте чек :) -
Гастур
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.