Сценарий оболочки не запускает команду 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)

с возможностью изменить настройки профиля или перезапустить процесс. Я также попытался использовать абсолютный путь вместо ~/, и все мои имена файлов написаны правильно и указывают на правильное место. Что случилось?

Giaphage47
источник

Ответы:

16

cd это встроенная оболочка Вы должны использовать это:

#! /bin/bash
gnome-terminal --working-directory=/home/username/Desktop/CCA/ -e './Adventure'
Тахер Хоршиди
источник
Спасибо, я не знал, что cdэто не команда.
Giaphage47
1
cdконечно , это команда! Это то, что известно как встроенная команда оболочки , как правильно говорит ответ Хастура . Встроенные команды оболочки часто называются «встроенными командами оболочки» или «встроенными» для краткости, но они абсолютно команды. Что cdне является внешней командой . У Ubuntu нет cd программыесли она будет запущена, она все равно не приведет к изменению каталога в оболочке, из которой вы ее запустили ). @ Giaphage47
Каган,
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. Выберите «Правка» ▸ «Настройки профиля» ▸ «Заголовок и команда».

  2. Установите флажок Выполнить пользовательскую команду вместо моей оболочки.

  3. В текстовом поле введите команду или желаемую оболочку.

  4. Команда будет передана в терминал точно в том виде, в котором вы ее написали, включая все заданные вами аргументы. Переменные среды будут унаследованы от терминала, поскольку это дочерний процесс терминала.

    Откройте новую вкладку или окно терминала, чтобы увидеть, как выполняется пользовательская оболочка или команда

Hastur
источник
Но смысл состоял в том, чтобы запустить из сценария оболочки, а не открывать окно терминала.
Giaphage47
Если вы хотите запустить из скрипта, достаточно alias(более удобного) или скрипта в вашем каталоге ~ / bin, без запуска нового терминала
Hastur
Ответ обновляется на тот случай, если вам понадобится снова: его можно передать, cdно вам нужно передать его bash. Дайте ему чек :) -
Hastur